我正在使用jackson映射器将json字符串映射到一个类。类看起来是这样的:
class MyClass{
@JsonProperty("my_boolean")
private boolean myBoolean;
@JsonProperty("my_int")
private int myInt;
//Getters and setters
}
我想检查字段myBoolean和myInt是否真的被设置或包含它们的默认值(false和0)。我尝试使用反射并检查字段是否为null,但我想这对基元类型不起作用。这就是我现在拥有的:
Field[] fields = myClass.getClass().getDeclaredFields();
for (Field field : fields) {
try {
field.setAccessible(true);
Object myObject = field.get(myClass);
if(myObject != null) {
//Thought this would work, but it doesn't
}
}
}
我还能怎么查?
谢谢。
您应该检查字段类型是否为基元,如果是基元,则根据默认包装器检查值。例如:
Map<Class, Object> defaultValues = new HashMap<Class, Object>();
defaultValues.put(Integer.class, Integer.valueOf(0));
// etc - include all primitive types
然后:
Object value = field.get(myClass);
if (value == null ||
(field.getType().isPrimitive() && value.equals(defaultValues.get(field.getType())) {
// Field has its default value
}
这不会判断字段是否已设置,只会判断其当前值是否为该类型的默认值。您无法区分值为0的字段(因为它是以这种方式显式设置的)和根本没有显式分配的字段。
您还可以使用具有默认值的对象,而不是基元类型;即
class MyClass{
@JsonProperty("my_boolean")
private Boolean myBoolean = BOOLEAN_DEFAULT; // get it from a map
@JsonProperty("my_int")
private Integer myInt = INT_DEFAULT; // get it from a map
//Getters and setters
}
然后
if (myClass.getMyInt() == null) {
// The value is explicitly set to null
} else if (defaultValuesMap.get(Integer.class).equals(myClass.getMyInt())) {
// The value has its default value
} else {
// etc
}