2016-04-22 307 views
1

我使用gson從json字符串構建Java對象。 JSON的結構建立了一個「詢問」是可包含任一Gson解析遞歸json結構

一個)規則,由條件組合(AND或OR)再次

b)一種礦石多個查詢,合併由條件(AND或OR) (一)很簡單,但一個工具(b)怎麼可能?

這裏來的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" 
     } 
     ] 
    } 
    ] 
} 

,這我的java類,代表了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; 
    } 

} 

回答

0

隨着該JSON種有效載荷,你將無法得到Gson將其直接映射到某個類層次結構。您的評論專欄是正確的:您需要一個自定義轉換器。使用新的TypeAdapter。在那裏,你需要檢測你正在閱讀的條件/規則或查詢。好消息是,字段名稱集是不同的,所以你只需要讀取第一個字段,然後分支讀取完整Rule,Query或任何你檢測到的。

看看類JsonReader,特別是peek方法。

另外,請記住,您可以將您的解析委託給其他TypeAdapter。這是遞歸你要求的部分。從Gson對象中,您可以請求任何對象的TypeAdapter。參見方法getAdapter。例如,您可以將它與Rule類一起使用。

沒有單一的解決方案。你可以寫所有的解析並做所有的遞歸,你可以使用委託等。