2016-04-21 8 views
1

Ich benutze gson um verschiedene Objekttypen zu deserialisieren und es gibt einige primitive Typen in diesen Klassen. Wenn ich ein JSON-Objekt für diese Typen deserialize, erhalten primitive Typen ihre Standardwerte.gson finde fehlende primitive Felder

Also verwende ich Wrapper-Klassen für primitive Felder zu verstehen, wenn das Feld nicht in der JSON vorhanden war, da sie auf Null gesetzt sind, wenn Wert fehlt.

class Class{ 
    integer int1; 
} 

int1 Feld wird 0, wenn es nicht in der JSON vorhanden ist. Also habe ich keine Möglichkeit zu verstehen, ob das Feld auf 0 gesetzt wurde oder nicht in der JSON vorhanden war. Aber ich brauche eine Möglichkeit zu verstehen, ob diese Felder in der JSON vorhanden sind, ohne eine Wrapper-Klasse zu verwenden.

Dank

+0

definieren „besser ". – shmosel

+0

Ich brauche einen Weg zu verstehen, ob diese Felder in der JSON vorhanden sind, auch wenn ich sie als primitive Felder ohne Wrapper-Klassen definieren. –

+0

Angenommen, Sie beziehen sich auf "Integer", "Boolean" usw., was genau ist das Problem? Wenn Sie das Problem nicht angeben, können wir nicht versuchen, es zu lösen. – shmosel

Antwort

0

Ich bin auch gleich, Problem.

Wenn Sie primitiven Typ verwenden, dann hat es seine Standarddaten. Für Integer 0, Boolean false, etc .., ist es nicht von der GSON. Wenn Sie ein Feld/eine Variable definiert haben, hat es einen Standardwert im Speicher. Dafür habe ich die Lösung entworfen, GSON wird immer im Feld suchen. Also, was ich getan habe, ist, dass ich alle Strings definiert habe. Strings oder andere Objekte enthalten Nullen. Schreiben Sie eine Getter-Methode, die einen primitiven Typwert zurückgibt.

für zB:

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

Dies ist, was ich nach der Forschung getan haben:

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

Dann ordne ich es zu einem gsonBuilder wie folgt aus:

public <T> RequiredFieldAwareGsonBuilder withRequiredFieldAwareType(Class<T> classOfT) { 
     gsonBuilder.registerTypeAdapter(classOfT, new AnnotatedDeserializer<T>()); 
     return this; 
    }