杰克逊从JSON中的变量类型反序列化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杰克逊从JSON中的变量类型反序列化相关的知识,希望对你有一定的参考价值。
我试图使用Jackson反序列化JSON,其中包含一个项目列表,其中单个列表项可以是字符串,或者它们可以是字符串的子列表。处理这种情况的首选方法是什么?
示例Json:
"anObject" : {
"stuff": [
"a",
"b",
["x","y","z"]
]
}
我得到了以下工作:
public AnObject {
private List<Object> stuff;
}
TypeReference<HashMap<String, List<AnObject>>> typeRef =
new TypeReference<HashMap<String, List<AnObject>>>() {};
try {
HashMap<String, List<AnObject>> map = mapper.readValue(json, typeRef);
} catch (IOException e) {
e.printStackTrace();
}
但是,我觉得这不是理想的方式。有人可以与我分享我如何更好地处理这个问题吗?提前致谢!
答案
您可以使用quicktype生成用于反序列化的代码。基本上你必须为“字符串或字符串数组”类型编写自己的反序列化器:
package io.quicktype;
import java.util.Map;
import java.io.IOException;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.*;
@JsonDeserialize(using = Stuff.Deserializer.class)
@JsonSerialize(using = Stuff.Serializer.class)
public class Stuff {
public String stringValue;
public String[] stringArrayValue;
static class Deserializer extends JsonDeserializer {
@Override
public Stuff deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
Stuff value = new Stuff();
switch (jsonParser.getCurrentToken()) {
case VALUE_STRING:
value.stringValue = jsonParser.readValueAs(String.class);
break;
case START_ARRAY:
value.stringArrayValue = jsonParser.readValueAs(String[].class);
break;
default: throw new IOException("Cannot deserialize Stuff");
}
return value;
}
}
static class Serializer extends JsonSerializer {
@Override
public void serialize(Stuff obj, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (obj.stringValue != null) {
jsonGenerator.writeObject(obj.stringValue);
return;
}
if (obj.stringArrayValue != null) {
jsonGenerator.writeObject(obj.stringArrayValue);
return;
}
throw new IOException("Stuff must not be null");
}
}
}
以上是关于杰克逊从JSON中的变量类型反序列化的主要内容,如果未能解决你的问题,请参考以下文章
使用杰克逊的 JSON 反序列化:没有找到适合类型的构造函数 - 可以提供默认构造函数或注释构造函数 [重复]