我正在使用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;
}
}
答案 0 :(得分:0)
使用JSON类型的有效负载,您无法让Gson将其直接映射到某个类层次结构。您的注释行是正确的:您需要一个自定义转换器。使用新的TypeAdapter
。在那里,您需要检测是否正在阅读条件/规则或查询。好消息是,字段名称的集合是不同的,因此您只需要读取第一个字段然后分支以读取完整的Rule
,Query
或您检测到的任何内容。
查看课程JsonReader
,特别是peek
方法。
另外,请记住,您可以将解析委托给其他TypeAdapter
。这就是你要求的递归部分。从Gson
对象,您可以为任何对象请求TypeAdapter
。请参阅方法getAdapter
。例如,您可以将其与Rule
类一起使用。
没有单一的解决方案。您可以编写所有解析并执行所有递归,也可以使用委托等。