java - gson 查找缺失的原始字段

标签 java json gson missing-data primitive

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

因此,我使用原始字段的包装类来了解该字段是否不存在于 json 中,因为如果值丢失,它们将设置为 null。

class Class{
  integer int1;
} 

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

谢谢

最佳答案

这是我经过研究后所做的:

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;
    }

关于java - gson 查找缺失的原始字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36763444/

相关文章:

android - 如何为空值设置 JSONObject 默认字符串

java - 从 json 创建 java 对象列表

Java Swing - 本地化温度

Java Gradle : How to include external jars using java-plugin jar task?

JavaScript 循环遍历 Json 日期

java - Jackson 在 OracleResultSet 的数值周围加上引号

java - 如何用Gson单独提取json字符串对象

java - 像 Java 一样在 Rails 中打开 HTTP 连接?

java - JTable 转到行

java - Maven 构建抛出 java.lang.NoClassDefFoundError