2017-02-19 8 views
0

ich in einer Situation bin, wo ich die folgende JSON zu analysieren haben:Gson deserialize String in zwei ganzen Zahlen

{ "maj:min": "8:80" } 

Ich weiß, dass maj und min wird immer von Integer-Typ sein, so dass die Klasse-I-Parsing bin zu hat diese beiden Felder als ganze Zahlen:

public int maj; 
public int min; 

wie kann ich Gson zu geben, das „maj: min“ get Feld spezielle treatement und analysiert es dementsprechend während Deserialisieren?

+0

Können Sie die JSON-Struktur so ändern, dass es {"maj": 8, "min": 80} ist? Dies wird von GSON leichter nachvollziehbar sein. –

+0

Ich habe keine Kontrolle darüber, wie ich den JSON erhalte. – octavio

+0

Wie wäre es mit einem benutzerdefinierten Deserializer (http://stackoverflow.com/questions/8165412/gson-custom-deserializing-logic-based-on-field-name)? Es scheint eine Menge Arbeit für diesen einfachen Fall zu sein, sollte aber funktionieren. –

Antwort

2

Erstellen Sie das Modell für das benutzerdefinierte Feld:

public class CustomHour { 

    public int maj; 
    public int min; 

    public CustomHour(int maj, int min) { 
     this.maj = maj; 
     this.min = min; 
    } 
} 

die Deserializer für diese benutzerdefinierte Klasse Körperbau:

public class CustomHourDeserializer implements JsonDeserializer<CustomHour> { 

    public CustomHour deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { 

     String[] data = json.getAsJsonPrimitive().getAsString().split(":"); 
     int maj = Integer.parseInt(data[0]); 
     int min = Integer.parseInt(data[1]); 
     return new CustomHour(maj, min); 
    } 
} 

Erstellen Sie Ihre Data Klasse, die das benutzerdefinierte Feld (mit dem Feldnamen) einbetten:

Register CustomHourDeserializer als Typ ad Vor der Deserialisierung:

String input = "{ \"maj:min\": \"8:80\" }"; 
GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(CustomHour.class, new CustomHourDeserializer()); 
Gson gson = gsonBuilder.create(); 
Data data = gson.fromJson(input, Data.class); 
System.out.println("min : " + data.hour.min + " | max : " + data.hour.maj); 
+0

Schön! Ich erhalte alles Wert als String, auch wenn einige immer ganze Zahlen sind. Kannst du mir helfen, diese entsprechend zu analysieren? – octavio

+1

Können Sie ein Beispiel für Ihre Dateneingabe angeben? –

+0

z.B. {"size": "1000"} - aber ich könnte das leicht lösen, indem ich nur Anmerkungen zu meiner Klasse verwende, z. @SerializedName ("Größe") private int size; Vielen Dank. – octavio

Verwandte Themen