2017-11-28 4 views
1

Meine vorherige Frage dazu kam nicht wirklich, und vielleicht fragte ich nicht das Richtige oder es war zu detailliert.Deserialize JSON-Klasse zu Java-Klasse mit anderen Namen

Meine grundlegende Frage ist jetzt, wie kann ich ein JSON-Objekt mit einem Klassennamen zu einem Java-Objekt mit einem anderen Klassennamen deserialisieren?

Zum Beispiel ist die JSON-Klasse der Server sendet/erwartet ist "18" (ich habe keine Kontrolle darüber). Meine Java-Klasse kann nicht "18" sein, also ist es "_18".

Einfach das neue Gson(). FromJson() zu tun, hat nicht geholfen, auch mit anderen Benennungsrichtlinien; Das Objekt _18 ist immer null. Seitdem habe ich über Typ-Adapter und verschiedene Anmerkungen gelesen, aber ich weiß noch nicht, wie ich das angehen soll. Die Methode, die am sinnvollsten erschien, @SerializedName, kann anscheinend nicht für die Klasse selbst verwendet werden, sondern nur für Feldmitglieder.

Wie kann ich ein JSON-Objekt mit einer Klasse namens 18 zu einer Java-Klasse namens _18 deserialisieren (oder besser, wenn es möglich ist, kann ich der Klasse einen echten Namen geben)?

Beispiel JSON, auf Anfrage:

"18": { 
    "field1": "value1", 
    "field2": "value2", 
    "field3": "value3" 
} 
+1

Können Sie eine Probe des JSON schreiben Sie es zu tun? –

+0

Beispiel für JSON, das in Bearbeitung hinzugefügt wurde. – sorinev

+0

Verwenden Sie eine Map : "18" ist der Schlüssel der Map. –

Antwort

2

Zunächst einmal - JSON hat keine Vorstellung von Klasse - es ist eine String-Darstellung eines Objekts. Ihr Beispiel ist also nur ein fehlerhafter JSON. Es muss wie sein:

{"18": 
{ 
    "field1": "value1", 
    "field2": "value2", 
    "field3": "value3" 
    } 
} 

Das mit dem Feld „18“, wie einer anderen Klasse mit field1, field2 und field3 Eigenschaften seinerseits gültig JSON-Objekt ist.

also, wenn der Server JSON-String wie Ihre Show zurückgibt - um ihn zu analysieren, müssen Sie ihn mit {} umgeben und dann wird Ihre Java-Klasse die Eigenschaft für "18" haben, wie Sie sie für Java von @SerializedName annotation nennen wollen.

finden Sie im Beispieltestfall unter:

public static void main(String... args) throws Exception { 

    String testJson = "{\"18\":{\"name\":\"poomba\",\"value\":\"topchoomba\"}}"; 

    Gson gson = new GsonBuilder().create(); 

    MyClassFor18 test18 = gson.fromJson(testJson, MyClassFor18.class); 

    System.out.println(test18); 

} 

private static class MyClassFor18 { 

    @SerializedName ("18") 
    private TestPojo valueObject; 

    public TestPojo getValueObject() { 
     return valueObject; 
    } 

    public void setValueObject(TestPojo valueObject) { 
     this.valueObject = valueObject; 
    } 

    @Override 
    public String toString() { 

     return "MyClassFor18 (value=" + valueObject + ")"; 
    } 

} 
private static class TestPojo { 

    private String name; 
    private String value; 

    public TestPojo(String name, String value) { 

     this.name = name; 
     this.value = value; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getValue() { 
     return value; 
    } 

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

    @Override 
    public String toString() { 

     return "TestPojo { name=" + this.name + ", value=" + this.value 
       + "}"; 
    } 
}