2016-06-02 10 views
3

Ich habe eine Android-App, die eine Zeichenfolge im JSON-Format empfängt.Dynamische Objekterzeugung aus JSON

Die JSON-Struktur enthält ein Array von JSON-Objekten unterschiedlicher Typen. Ich werde eine Klasse für jeden Typ erstellen und die Objekte direkt aus JSON mit Hilfe eines JSON-Framework instanziieren.

Um es einfacher zu machen, lassen Sie uns das folgende Beispiel denken:

Wir haben zwei Java-Klassen:

public class A 
{ 
    public String a1 = ""; 

    public int a2 = 0; 

} 

public class B 
{ 
    public double b1 = 0; 
    public double b2 = 0; 
    public double b3 = 0; 
} 

noch z.B. wir haben ein JSON-Array

[ 
    { 
    "a1": "Teststring", 
    "a2": 12 
    }, 
    { 
    "b1": 3, 
    "b2": 4, 
    "b3": 5 
    }, 
    { 
    "a1": "Teststring2", 
    "a2": 24 
    } 
] 

in den kommenden Ich weiß nicht, was, wie viele oder in welcher Reihenfolge die JSON-Objekte in kommen. Aber ich bin in der Lage, ihre JSON Darstellung zu ändern.

Eine Lösung, die ich denken kann:

Soweit ich aus der Lektüre über Frameworks verstanden, Jackson im Vergleich ist in der Lage zu Gson beides zu tun, bestimmte Werte lesen und Java-Instanzen zu erzeugen.

[ 
    { 
    "type": "A", 
    "a1": "Teststring", 
    "a2": 12 
    }, 
    { 
    "type": "B", 
    "b1": 3, 
    "b2": 4, 
    "b3": 5 
    }, 
    { 
    "type": "A", 
    "a1": "Teststring2", 
    "a2": 24 
    } 
] 

als lies den Wert von Typ und dann das richtige Objekt aus, dass generieren: So konnte ich Typinformationen zu den JSON-Objekten hinzufügen.

Was halten Sie von meinem Ansatz? Gibt es eine gemeinsame Lösung für mein Problem?

+0

Haben Sie eine Kontrolle über das JSON-Objekt gesendet? Ich meine, wenn es ein Server ist, der die JSON-Antworten sendet, kontrollierst du den Server oder läuft er bereits? – pahan

+0

Ich kontrolliere den Server. – Programmer879

+0

Dann, wie Sie sagten, erwähnen Sie den Typ des Objekts, das Sie im JSON-Objekt selbst senden. Es ist sicher und reduziert die Arbeitsbelastung auf der Client-Seite. – pahan

Antwort

1

Wenn Sie Typen im Array mischen, würden Sie die Typ-Informationen benötige ich denke, die Dinge einfach zu halten analysieren nur die JSON zu einer List<Map<String,Object>> und während Sie iterieren Blick auf die Art und verwenden entweder

mapper.readValue(input, A.class) 

oder

mapper.readValue(input, B.class) 

basierend auf dem Typ, den Sie begegnen.

Sie können diesen Mapping-Schritt möglicherweise überspringen und einfach unter Map<String,Object> arbeiten, um zusätzlichen Overhead zu vermeiden. Effizienz und schöner Code gehen manchmal nicht Hand in Hand;)

2

Anstatt alles in ein Array zu setzen, warum nicht ein json-Objekt verwenden und die Objekte als Mitglieder hinzufügen, mit einem generischen Namen bestehend aus - lets sagen - der Typ und etwas Index.

{ 
     "A0": 
     { ... }, 
     "B0": 
     { ... }, 
     "A1": 
     { ... }, 
    } 
+0

Sie können dann über die Elemente des Json-Objekts iterieren und die einzelnen Typen anhand des entsprechenden Schlüssels bestimmen. – Androbin