gson找到丢失的原始字段

时间:2016-04-21 08:03:54

标签: java json gson missing-data primitive

我使用gson反序列化不同的对象类型,这些类中有一些原始类型。当我将json对象反序列化为这些类型时,基本类型将获得其默认值。

所以我使用原始字段的包装类来理解json中是否存在该字段,因为如果缺少值,它们将被设置为null。

class Class{
  integer int1;
} 

如果json中不存在,则int1字段为0。所以我无法理解该字段是否设置为0或者是否存在于json中。但是我需要一种方法来理解这些字段是否存在于json中而不使用包装类。

由于

2 个答案:

答案 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);
  }
}