2016-04-21 202 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; 
    }