我正在使用Gson将JSON(由jquery查询构建器生成)解析为相应的Java Object。我的问题是属性“value”可以是数组或单个值:
{
"condition": "AND",
"rules": [
{
"id": "date",
"field": "date",
"type": "date",
"input": "text",
"operator": "between",
"value": [
"01.01.2016",
"20.01.2016"
]
}
]
}
或
{
"condition": "AND",
"rules": [
{
"id": "date",
"field": "date",
"type": "date",
"input": "text",
"operator": "equal",
"value": "01.01.2016"
}
]
}
显然Gson可以为第一个JSON构建对象,如果我的类有private String[] value
这样的字段,第二个是private String value
这样的字段 - 但不是两个带有Java字段选项的JSON输入。
所以我的问题:是一种处理这两种方式的方法,无论是单个“值”还是一系列“值”?
答案 0 :(得分:1)
我不知道你用来反序化这个JSON的类的结构是什么,但是我想知道有这样的类
public class Rule {
private String id;
private String field;
private String type;
private String input;
private String operator;
private List<String> value;
// constructors, getters and setters
}
如您所见,value
属性被定义为java.lang.String
个对象的列表。这种方法将帮助我们处理这两种情况:value
是一个数组,当它是一个简单的字符串值。
我们可以用Gson做些什么?我们可以像这样创建自定义反序列化器
public class CustomSerializer implements JsonDeserializer<Rule> {
public Rule deserialize(JsonElement jsonElement, Type type,
JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
JsonObject obj = (JsonObject) jsonElement;
JsonElement value = obj.get("value");
List<String> values = new ArrayList();
if (value.isJsonArray()) {
for (JsonElement jsonElement1 : value.getAsJsonArray()) {
String str = jsonElement1.getAsString();
values.add(str);
}
} else {
values.add(value.getAsString());
}
// deserialize other properties
Rule rule = new Rule();
rule.setValue(values);
// set other properties
return rule;
}
}
之后,您需要使用
注册反序列化器Gson gson = new GsonBuilder()
.registerTypeAdapter(Rule.class, new CustomSerializer ())
.create();
您可以反序列化JSON对象,如
{
"id": "date",
"field": "date",
"type": "date",
"input": "text",
"operator": "equal",
"value": "01.01.2016"
}
这是整个数据结构的一部分。