java – GSON反序列化字符串或字符串数组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – GSON反序列化字符串或字符串数组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2229字,纯文字阅读大概需要4分钟。
内容图文
![java – GSON反序列化字符串或字符串数组](/upload/InfoBanner/zyjiaocheng/811/f7bc7c8074934e7ba5aaf503af7d9d7d.jpg)
我在反序列化包含0到多个子对象的对象时遇到了一些麻烦,这些对象可以包含字符串或特定值的字符串数组.
这是一个JSON示例
{
"name": "process name",
"tasks": [{
"name": "task 1",
"fields": [{
"name": "field 1",
"value": "123abc"
},
{
"name": "field 2",
"value": ["value 1", "value 2"]
}
]
},
{
"name": "task 2",
"fields": []
}]
}
我有一个Java实体设置来匹配这个结构,如下所示:
public class Process {
public Process() {}
public String name;
public Task[] tasks;
}
public class Task {
public Task() {}
public String name;
public Field[] fields;
}
public class Field {
public Field() field;
public String name;
public String value;
}
我这样反序列化:
static <T> T fetch(MyHttpRequest request, Class<T> entity)
{
String response = sendRequestAndParse(request);
if (response == null) {
log.debug(String.format("API response was null %n)"));
return null;
}
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
return gson.fromJson(response, entity);
}
我使用动态类型,因为除了Process之外还有许多其他实体,我使用相同的方法.但我无法弄清楚如何处理字段值可以是字符串数组的字符串的情况.任何指针将不胜感激.
解决方法:
可能最简单的选择是使用自定义序列化器和反序列化器,并将值类型从String更改为List< String>以下是如何解决这个问题的基本思路:
private static class MyJsonAdapter implements JsonSerializer<List<String>>,
JsonDeserializer<List<String>>{
@Override
public JsonElement serialize(List<String> list, Type t,
JsonSerializationContext jsc) {
if (list.size() == 1) {
return jsc.serialize(list.get(0));
} else {
return jsc.serialize(list);
}
}
@Override
public List<String> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext jsc)
throws JsonParseException {
List<String> result;
if (json.isJsonArray()) {
result = jsc.deserialize(json, typeOfT);
}else {
result = new ArrayList<>();
result.add((String) jsc.deserialize(json, String.class));
}
return result;
}
}
和Field POJO
public static class Field {
public String name;
// Use @JsonAdapter(MyJsonAdapter.class)
// or register serializer and deserializer in
// new GsonBuilder().registerTypeAdapter(new MyJsonAdapter())
@JsonAdapter(MyJsonAdapter.class)
public List<String> value; // need to change value type to list
}
PS.如果您可以从Gson切换到Jackson,可以使用1行代码DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY解决此问题
内容总结
以上是互联网集市为您收集整理的java – GSON反序列化字符串或字符串数组全部内容,希望文章能够帮你解决java – GSON反序列化字符串或字符串数组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。