我使用gson反序列化不同的对象类型,这些类中有一些原始类型。当我将json对象反序列化为这些类型时,基本类型将获得其默认值。
所以我使用原始字段的包装类来理解json中是否存在该字段,因为如果缺少值,它们将被设置为null。
class Class{
integer int1;
}
如果json中不存在,则int1字段为0。所以我无法理解该字段是否设置为0或者是否存在于json中。但是我需要一种方法来理解这些字段是否存在于json中而不使用包装类。
由于
答案 0 :(得分:1)
这是我在研究后所做的事情:
public class AnnotatedDeserializer<T> implements JsonDeserializer<T> {
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException {
List<String> jsonFields = new ArrayList<>();
for(Map.Entry<String,JsonElement> entry : je.getAsJsonObject().entrySet()) {
jsonFields.add(entry.getKey());
}
List<String> classFields = new ArrayList<>();
List<String> optionalClassFields = new ArrayList<>();
try{
for(Field field : Arrays.asList(Class.forName(type.getTypeName()).getDeclaredFields())){
if(field.getAnnotation(OptionalField.class) == null)
classFields.add(field.getName());
else
optionalClassFields.add(field.getName());
}
}catch(Exception exception){
}
for(String field : classFields) {
if(!jsonFields.contains(field))
throw new JsonParseException("Missing field in JSON: {"
+ field + "}");
}
for(String jsonField : jsonFields)
if(!classFields.contains(jsonField) && !optionalClassFields.contains(jsonField)){
throw new JsonParseException("Unknown field in JSON: {"
+ jsonField + "}");
}
Gson gson = new GsonBuilder().create();
T target = gson.fromJson(je, type);
return target;
}
然后我将它分配给像这样的gsonBuilder:
public <T> RequiredFieldAwareGsonBuilder withRequiredFieldAwareType(Class<T> classOfT) {
gsonBuilder.registerTypeAdapter(classOfT, new AnnotatedDeserializer<T>());
return this;
}
答案 1 :(得分:0)
我也面临同样的问题。
我认为它与原始类型和默认值有关。我通过将所有字段定义为stringsm来解决此问题,因为它们将保留null
s。我写了一个getter,它将返回一个原始类型值,但返回一个默认值以避免null
。
例如:
class Class{
String int1;
public int getint1(){
return int1==null?-1:Integer.parseInt(int1);
}
}