gpt4 book ai didi

java - Gson:处理可选列表

转载 作者:行者123 更新时间:2023-12-01 10:06:23 24 4
gpt4 key购买 nike

我正在使用 Gson 将 JSON(由 jquery 查询构建器生成)解析为相应的 Java 对象。我的问题是属性“值”可以是数组或单个值:

{
"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"
}
]
}

如果我的类有像 private String[] value 这样的字段,显然 Gson 可以为第一个 JSON 构建对象。对于第二个,像 private String value 这样的字段— 但不是两个 JSON 输入都具有任一 Java 字段选项。

所以我的问题:是否有一种方法可以同时处理单个“值”或“值”数组?

最佳答案

我不知道您用来反序列化此 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"
}

这是整个数据结构的一部分。

关于java - Gson:处理可选列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36433259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com