Gson解析递归的json结构

时间:2016-04-22 19:33:06

标签: json recursion gson

我正在使用gson从json字符串构建Java对象。 json结构构建了一个“查询”,可以包含

a)规则,由条件(AND或OR)组合

b)再次进行多次查询,由条件(AND或OR)组合

(a)很简单,但是如何实现(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;
    }

}

1 个答案:

答案 0 :(得分:0)

使用JSON类型的有效负载,您无法让Gson将其直接映射到某个类层次结构。您的注释行是正确的:您需要一个自定义转换器。使用新的TypeAdapter。在那里,您需要检测是否正在阅读条件/规则或查询。好消息是,字段名称的集合是不同的,因此您只需要读取第一个字段然后分支以读取完整的RuleQuery或您检测到的任何内容。

查看课程JsonReader,特别是peek方法。

另外,请记住,您可以将解析委托给其他TypeAdapter。这就是你要求的递归部分。从Gson对象,您可以为任何对象请求TypeAdapter。请参阅方法getAdapter。例如,您可以将其与Rule类一起使用。

没有单一的解决方案。您可以编写所有解析并执行所有递归,也可以使用委托等。