2016-04-22 6 views
1

Ich benutze Gson, um Java-Objekte aus JSON-Strings zu erstellen. Die json Struktur baut eine "Abfrage", die entwederGson, um eine rekursive JSON-Struktur zu analysieren

a) Regeln enthalten kann, durch eine Bedingung kombiniert (AND oder OR)

b) ein oder mehrere Abfragen wieder zusammengeführt, durch eine Bedingung (AND oder OR)

(a) ist einfach, aber wie kann man (b) implementieren?

hier kommt eine Probe des json:

{ 
    "condition": "AND", 
    "rules": [ 
    { 
     "id": "amount", 
     "field": "amount", 
     "type": "double", 
     "input": "text", 
     "operator": "greater", 
     "value": "80" 
    }, 
    { 
     "condition": "OR", 
     "rules": [ 
     { 
      "id": "text", 
      "field": "text", 
      "type": "string", 
      "input": "text", 
      "operator": "contains", 
      "value": "rewe" 
     }, 
     { 
      "id": "text", 
      "field": "text", 
      "type": "string", 
      "input": "text", 
      "operator": "contains", 
      "value": "aldi" 
     } 
     ] 
    } 
    ] 
} 

und diese meine Java-Klasse, die die json:

public class QueryBuilder { 
    public String condition; 
    private List<Rule> rules; 
    private List<QueryBuilder> children; // <-- should I do it like this? 

    public static QueryBuilder buildFromJson(String json) { 
//  Gson g = new Gson(); 
     Gson g = new GsonBuilder() 
       //.registerTypeAdapter(Rule.class, new JsonCustomSerializer()) 
       .create(); 

     return g.fromJson(json, QueryBuilder.class); 
    } 

    public String toJson() { 
     Gson g = new Gson(); 
     return g.toJson(this); 
    } 

    public String getCondition() { 
     return condition; 
    } 

    public void setCondition(String condition) { 
     this.condition = condition; 
    } 

    public List<Rule> getRules() { 
     return rules; 
    } 

    public void setRules(List<Rule> rules) { 
     this.rules = rules; 
    } 



    public List<QueryBuilder> getChildren() { 
     return children; 
    } 

    public void setChildren(List<QueryBuilder> children) { 
     this.children = children; 
    } 

} 

Antwort

0

Mit dieser JSON Art von Nutzlast werden Sie nicht erhalten werden können, Gson, um es direkt einer Klassenhierarchie zuzuordnen. Ihre kommentierte Zeile ist richtig: Sie benötigen einen benutzerdefinierten Konverter. Verwenden Sie das neue TypeAdapter. Dort müssten Sie erkennen, ob Sie eine Bedingung/Regel oder eine Abfrage lesen. Die gute Nachricht ist, dass die Menge der Feldnamen unterschiedlich ist. Sie müssen also nur das erste Feld lesen und dann verzweigen, um eine vollständige Rule, Query oder was auch immer Sie entdeckt haben.

Werfen Sie einen Blick auf die Klasse JsonReader, speziell die peek Methode.

Denken Sie auch daran, dass Sie Ihre Analyse an andere delegieren können TypeAdapter. Das ist der Rekursion Teil, nach dem Sie fragen. Von einem Gson Objekt können Sie für jedes Objekt nach einem TypeAdapter fragen. Siehe Methode getAdapter. Sie können es zum Beispiel mit Ihrer Klasse Rule verwenden.

Es gibt keine einzelne Lösung. Sie können das gesamte Parsing schreiben und die gesamte Rekursion ausführen, Sie können Delegierung usw. verwenden.

Verwandte Themen