Java gson查找缺少的基本字段

Java gson查找缺少的基本字段,java,json,gson,missing-data,primitive,Java,Json,Gson,Missing Data,Primitive,我使用gson反序列化不同的对象类型,这些类中有一些基本类型。当我将json对象反序列化为这些类型时,基元类型将获得它们的默认值 因此,我使用原始字段的包装器类来理解json中是否不存在该字段,因为如果缺少值,它们将被设置为null class Class{ integer int1; } 如果json中不存在int1字段,则该字段将获取0。因此,我无法理解该字段是设置为0还是不存在于json中。但我需要一种方法来理解这些字段是否存在于json中,而不使用包装器类 谢谢我也面临同样的问题

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

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

class Class{
  integer int1;
} 

如果json中不存在int1字段,则该字段将获取0。因此,我无法理解该字段是设置为0还是不存在于json中。但我需要一种方法来理解这些字段是否存在于json中,而不使用包装器类


谢谢

我也面临同样的问题

我认为这与基本类型和默认值有关。我通过将所有字段定义为stringsm解决了这个问题,因为它们将保持
null
s。我编写了一个getter,它将返回一个原语类型值,但返回一个默认值以避免
null

例如:

class Class{
  String int1;

  public int getint1(){
       return int1==null?-1:Integer.parseInt(int1);
  }
}

这是我在研究后做的:

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;
}
公共类AnnotatedDeserializer实现JsonDeserializer{ @凌驾 公共T反序列化(JsonElement je,类型类型,JsonDeserializationContext jdc)抛出JsonParseException{ List jsonFields=new ArrayList(); for(Map.Entry:je.getAsJsonObject().entrySet()){ 添加(entry.getKey()); } List classFields=new ArrayList(); List optionalClassFields=newarraylist(); 试一试{ for(字段:Arrays.asList(Class.forName(type.getTypeName()).getDeclaredFields())){ if(field.getAnnotation(OptionalField.class)==null) 添加(field.getName()); 其他的 optionalClassFields.add(field.getName()); } }捕获(异常){ } for(字符串字段:类字段){ 如果(!jsonFields.contains(字段)) 抛出新的JsonParseException(“JSON中缺少字段:{” +字段+“}”); } for(字符串jsonField:jsonFields) 如果(!classFields.contains(jsonField)&&!optionalClassFields.contains(jsonField)){ 抛出新的JsonParseException(“JSON中的未知字段:{” +jsonField+“}”); } Gson Gson=new GsonBuilder().create(); T target=gson.fromJson(je,type); 回报目标; } 然后我将其分配给gsonBuilder,如下所示:

public <T> RequiredFieldAwareGsonBuilder withRequiredFieldAwareType(Class<T> classOfT) {
        gsonBuilder.registerTypeAdapter(classOfT, new AnnotatedDeserializer<T>());
        return this;
    }
public required fieldawaregsonbuilder with required fieldawaretype(classOfT类){
registerTypeAdapter(ClassSoft,新的AnnotatedDeserializer());
归还这个;
}

我需要一种方法来理解这些字段是否存在于json中,即使我将它们定义为没有包装类的基本字段。假设您指的是
整数
布尔
等,到底是什么问题?如果您不指定问题,我们无法尝试解决它。我不想使用包装类来取消derstand缺少基本字段