2016-07-06 16 views
3

Ich habe folgendes jsonGson mit mehreren bekannten Klassen

{ "file": {"file": "foo.c", "owner": "user123"} 
    "methods": [{"name": "proc1", "value":"val"}, {"name":"proc2","value":"val2"}] 
    etc... 
} 

Ich weiß, dass ich so etwas wie

class file{ 
     public String file 
     public String owner 
    } 
class methods{ 
     public String name 
     public String value 
    } 

tun können, und ich kann entweder rufen

File file= gson.fromJson(jsonInString, File.class); 
methods[] array = gson.fromJson(jsonInString, methods[].class); 

aber was tun Ich tue, wenn ich einen komplexen JSON behandeln muss, der viele Objekte enthält. Ich kannnicht spezifizieren

+0

warum haben viele Objekte in der gleichen json? Ist es die Netzwerkbandbreite zu optimieren? – niceman

+0

Nein, die Idee ist, dass es mehrere Komponenten gibt, die der Benutzer definieren kann zum Beispiel, der Benutzer geht und definiert Methoden in einer Interaktion mit dem System. In einem anderen geht der Benutzer und definiert eine Datei so diese json in Stufen Benutzer gebaut werden wird geht, und wählen Sie Datei, wird JSON-Datei sein: {Daten}, Methoden: leer , nachdem der Benutzer geht und wählt es Methoden wird die Daten haben Die Idee ist, dass jede Komponente ist eine eigene Klasse, und ich werde von Klassen zu Json gehen, und umgekehrt – Quantico

+1

Wenn Ihr JSON ein vordefiniertes Schema hat, können Sie eine große Klasse (oder trennen Sie es in der Basisklasse und Unterklassen), die alle erwarteten Attribute enthalten – niceman

Antwort

1

Normalerweise befolge ich diesen Ansatz, um komplexe Klassen von json in Objekt umzuwandeln. Dieser Ansatz funktioniert für fast alles wie Liste, Map etc. Die Idee ist einfach Halter für die komplexen Klassen zu erstellen und dann die Klassen zu erstellen. Geben Sie so viel Tiefe wie nötig. Der Trick besteht darin, den Namen in Json und Ihren Haltern (und Unterklassen) zu vergleichen.

Datei Config:

class FileConfig{ 
    public String file; 
    public String owner; 

    //define toString, getters and setters 
} 

Methode Klasse:

class Method{ 
    public String name; 
    public String value; 

    //define toString, getters and setters 
} 

Methode Config:

class MethodConfig{ 
    List<Method> methods = null; 

    //define toString, getters and setters 
} 

Halten der Config:

public class HolderConfig { 

    private FileConfig file = null; 
    private MethodConfig methods = null; 

    public FileConfig getFile() { 
    return file; 
    } 

    public void setFile(FileConfig file) { 
    this.file = file; 
    } 
    public MethodConfig getMethods() { 
    return file; 
    } 

    public void setMethods(MethodConfig methods) { 
    this.methods = methods; 
    } 
} 

Aufbau der config:

public class HolderConfigBuilder { 

public static HolderConfig build(JsonObject holderConfigJson) { 

    HolderConfig configHolderInstance = null;   

    Gson gsonInstance = null; 

    gsonInstance = new GsonBuilder().create(); 

    configHolderInstance = gsonInstance.fromJson(holderConfigJson,HolderConfig.class); 

    return configHolderInstance; 
    } 
} 

Demo Klasse:

public class App 
{ 
     public static void main(String[] args) 
     { 

      HolderConfig configHolderInstance = null; 
      FileConfig file = null; 
      configHolderInstance = HolderConfigBuilder.build(<Input Json>); 
      file = configHolderInstance.getFile(); 
      System.out.println("The fileConfig is : "+file.toString()); 
     } 
} 

Eingang Json:

{ "file": {"file": "foo.c", "owner": "user123"} 
    "methods": [ 
       {"name": "proc1", "value":"val"}, 
       {"name":"proc2","value":"val2"} 
      ] 
} 

Hinweis: Schreiben Sie den Code Eingang JSON in Ihrem Testcode zu erhalten.

Auf diese Weise müssen Sie, wenn Sie Ihrem JSON weitere Elemente hinzufügen, eine separate Klasse für dieses Element erstellen und einfach den Elementnamen wie in Ihrem json in die HolderConfig einfügen. Sie müssen den Rest des Codes nicht ändern.

Ich hoffe, es hilft.