2016-04-21 208 views
1

我正在使用gson反序列化不同的对象类型,并且在这些类中有一些基本类型。当我将json对象反序列化为这些类型时,基元类型将获得它们的默认值。gson找到丢失的原始字段

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

class Class{ 
    integer int1; 
} 

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

谢谢

+0

定义“更好”。 – shmosel

+0

我需要一种方法来了解这些字段是否存在于json中,即使我将它们定义为没有包装类的原始字段。 –

+0

假设你指的是整型,布尔等,究竟是什么问题?如果您不指定问题,我们不能尝试解决它。 – shmosel

回答

0

我也面临同样的问题。

如果你使用原始类型,那么它有它的默认数据。对于整数0,布尔值false等,它不是来自GSON。如果你定义了任何字段/变量,它将在内存中有一些默认值。为此我设计了解决方案,GSON将始终查看该字段。所以我做的是,我定义的都是字符串。字符串或任何对象都会包含空值。编写一个getter方法,它将返回一个基本类型值。

为如:

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

这就是我的研究之后完成:

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