java - GSON 可以是字符串数组或对象数组
问题描述
我正在尝试创建一个 GSON 类,但不确定如何处理这种情况。
根据 API 规范options
可以是一个列表值:["one", "two"] OR
可以是 {"value": "Label"} 对的列表,为值提供标签
{
...
"options": ["one", "two", "three"],
}
或者
{
...
"options": [{"light": "Solarized light"}, {"dark": "Solarized dark"}],
}
解决方案
您可以将此字段映射到Map<String, String>
:
class Pojo {
@JsonAdapter(OptionsJsonDeserializer.class)
private Map<String, String> options;
// getters, setters, toString, other properties
}
原语列表意味着您只有值(没有标签)。如果是JSON Object
s 列表,则您有带有标签的值。现在,您需要为给定的属性实现自定义反序列化器:
class OptionsJsonDeserializer implements JsonDeserializer<Map<String, String>> {
@Override
public Map<String, String> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json.isJsonArray()) {
Map<String, String> map = new HashMap<>();
JsonArray array = json.getAsJsonArray();
array.forEach(item -> {
if (item.isJsonPrimitive()) {
map.put(item.getAsString(), null);
} else if (item.isJsonObject()) {
item.getAsJsonObject().entrySet().forEach(entry -> {
map.put(entry.getKey(), entry.getValue().getAsString());
});
}
});
return map;
}
return Collections.emptyMap();
}
}
简单用法:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.annotations.JsonAdapter;
import java.io.File;
import java.io.FileReader;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class GsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
Gson gson = new GsonBuilder().create();
Pojo pojo = gson.fromJson(new FileReader(jsonFile), Pojo.class);
System.out.println(pojo);
}
}
对于JSON object
s:
{
"options": [
{
"light": "Solarized light"
},
{
"dark": "Solarized dark"
}
]
}
印刷:
Pojo{options={light=Solarized light, dark=Solarized dark}}
对于原语列表:
{
"options": [
"one",
"two",
"three"
]
}
印刷:
Pojo{options={one=null, two=null, three=null}}
推荐阅读
- regex - 在gvim中搜索带方括号的多个字符串
- r - 使用 tidyverse 和 sapply 在列表上创建函数
- api - Active Collab API - 自托管的 URL 结构
- c - 调用 CheckTokenMembership 总是失败(返回值总是 False) - 从 SCADA (WinCC) 调用
- react-native - React-Native 62.2 代码图片上传错误:网络错误
- wcf - .Net Core 3.1:不支持文本消息格式中使用的文本编码“iso-8859-1”。(参数“编码”)
- r - 选择只有一项为真的列
- javascript - 在 JavaScript 中使用 addEventListener 对 HTML 表进行排序
- android - 我从 Play 商店收到资源字符串错误?
- c - MATLAB C Mex 文件中的 OpenMP 仅产生 1 个线程