2016-06-11 7 views
1

Ich versuche, einige Json mit Gson zu analysieren, und ich habe folgendes Problem:Gson - json mit Feld Parsen, die Array oder String ist

Das ist mein json:

[{ 
    "label": "Check Digit", 
    "value": "W" 
}, 
{ 
    "label": "Equipment", 
    "value": [ 
    "With Standard Liftgate", 
    "(-) Version Packages" 
    ] 
}] 

Dies ist mein Java Klasse:

public class Decode { 

    private String label; 
    private List<String> value = new ArrayList<>(); 

    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 

    public List<String> getValue() { 
     return value; 
    } 

    public void setValue(List<String> value) { 
     this.value = value; 
    } 

} 

wie Gson zu machen und value als Array of String immer verwenden zu analysieren?

+0

ich diesen JSON-String mit Standard analysieren: ' new Gson(). fromJson (jsonString, WholeObjectClass.class) ' Ich denke, seine seltsame Situation, während das gleiche Feld verschiedene Typen haben kann. –

+2

Teilen Sie den Klassencode Ihres zugeordneten Objekts. – everton

+0

Ich habe Java-Klassencode hinzugefügt. Das Problem besteht darin, dass das erste Objekt in JSON eine Zeichenfolge anstelle einer Zeichenfolge aufweist. Json wird von externen API zur Verfügung gestellt. –

Antwort

4

Mein Vorschlag ist, wird dazu beitragen, Hoffnung:

[{ 
    "label": "Check Digit", 
    "value": ["W"] 
}, 
{ 
    "label": "Equipment", 
    "value": [ 
    "With Standard Liftgate", 
    "(-) Version Packages" 
    ] 
}] 

Wieder Ihre Parser-Klasse sein sollte wie folgt: -

Schritt 1: Bitte nehmen Sie folgende kleine Änderungen an Ihrem Decode Klasse.

Decode.java

import java.util.ArrayList; 
import java.util.List; 

public class Decode { 

private String label; 
private List<String> values = new ArrayList<>(); // in json it is "value" 

public String getLabel() { 
    return label; 
} 

public void setLabel(String label) { 
    this.label = label; 
} 

public List<String> getValues() { 
    return values; 
} 

public void setValues(List<String> values) { 
    this.values = values; 
} 

@Override 
public String toString() { 
    return "Decode [label=" + label + ", values=" + values + "]"; 
} 

} 

Schritt 2: Erstellen Sie JsonDeserializer folgende.

MyDeserializer.java

import java.lang.reflect.Type; 
import java.util.ArrayList; 
import java.util.List; 

import com.google.gson.Gson; 
import com.google.gson.JsonDeserializationContext; 
import com.google.gson.JsonDeserializer; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonObject; 
import com.google.gson.JsonParseException; 
import com.google.gson.reflect.TypeToken; 

public class MyDeserializer implements JsonDeserializer<Decode> { 

@Override 
public Decode deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { 
    JsonObject decodeObj = arg0.getAsJsonObject(); 
    Gson gson = new Gson(); 
    Decode decode = gson.fromJson(arg0, Decode.class); 
    List<String> values = null; 
    if (decodeObj.get("value").isJsonArray()) { 
     values = gson.fromJson(decodeObj.get("value"), new TypeToken<List<String>>() { 
     }.getType()); 
    } else { 
     String single = gson.fromJson(decodeObj.get("value"), String.class); 
     values = new ArrayList<String>(); 
     values.add(single); 
    } 
    decode.setValues(values); 
    return decode; 
} 

} 

Schritt 3: Nun ist es Zeit, um Ihre json deserialize wie folgt:

GsonMain.java

import java.io.File; 
import java.io.IOException; 
import java.nio.file.Files; 
import java.util.Arrays; 

import com.google.gson.GsonBuilder; 

public class GsonMain{ 
public static void main(String[] args) throws IOException { 
    String filename = "d:/test.json"; // contains the json 
    String content = new String(Files.readAllBytes(new File(filename).toPath())); 

    GsonBuilder b = new GsonBuilder(); 
    b.registerTypeAdapter(Decode.class, new MyDeserializer()); 
    Decode[] array = b.create().fromJson(content, Decode[].class); 
    System.out.println(Arrays.toString(array)); 
    } 

} 
+0

Danke! Es klappt! –

0

Die json ist nicht in der richtigen Format, sollte es sein:

public class Decode { 

    private String label; 
    private String[] value; 

    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 

    public String[] getValue() { 
     return value; 
    } 

    public void setValue(String[] value) { 
     this.value = value; 
    } 

} 

it :)

+0

Danke für die Antwort. Ich weiß, dass dieses Format seltsam ist, aber ich bekomme es von externen API. Ich bin auf der Suche nach einer Methode, um diese JSON wie es ist. –

+1

Dazu können Sie Ihre eigenen Deserializer versuchen, siehe folgenden Link: http://stackoverflow.com/questions/28319473/gson-same-field-name-different-types Lassen Sie mich wissen, wenn Sie noch meine Hilfe benötigen – Neo

+0

I verwendet eigenen Deserializer wie in Sanjeev Saha Antwort. Vielen Dank. –