我试图使用一个服务,它给我一个实体,它的字段是一个数组。
{
"id": "23233",
"items": [
{
"name": "item 1"
},
{
"name": "item 2"
}
]
}
但是,当数组包含单个项时,将返回项本身,而不是返回一个元素的数组。
{
"id": "43567",
"items": {
"name": "item only"
}
}
在这种情况下,Jackson无法转换为我的Java对象。
public class ResponseItem {
private String id;
private List<Item> items;
//Getters and setters...
}
有一个简单的解决方案吗?
可以使用自定义JsonDeserializer来解决此问题。
例如。
class CustomDeserializer extends JsonDeserializer<List<Item>> {
@Override
public List<Item> deserialize(JsonParser jsonParser, DeserializationContext context)
throws IOException, JsonProcessingException {
JsonNode node = jsonParser.readValueAsTree();
List<Item> items = new ArrayList<>();
ObjectMapper mapper = new ObjectMapper();
if (node.size() == 1) {
Item item = mapper.readValue(node.toString(), Item.class);
items.add(item);
} else {
for (int i = 0; i < node.size(); i++) {
Item item = mapper.readValue(node.get(i).toString(), Item.class);
items.add(item);
}
}
return items;
}
}
您需要告诉jackson使用此命令对项进行反序列化,例如:
@JsonDeserialize(using = CustomDeserializer.class)
private List<Item> items;
在那之后它就会工作了。快乐编码:)
我认为膏状物更符合规范。
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
private List<Item> items;
你不是第一个问这个问题的人。它看起来很旧。
在研究了这个问题之后,您可以使用DeseriazationFeature。ACCEPT_SINGLE_VALUE_AS_ARRAY
:
看留档:http://fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/jackson/databind/DeserializationFeature.html#ACCEPT_SINGLE_VALUE_AS_ARRAY
你需要将这个jackson特性添加到你的对象映射器中。
我希望它能帮助你。
我在试着读我的。json文件。Is是一个车辆存储类。 这是错误: com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造的实例(尽管至少存在一个Creator):无法构造的实例(尽管至少存在一个Creator):没有字符串参数构造函数/工厂方法来从[Source:(File); line: 1,列: 1]处的字符串值反序列化
我想将json反序列化到类Foo: IBar有两个实现,但是当反序列化时,我总是想使用第一个实现。(理想情况下,这将使问题变得更容易,因为不需要运行时类型检查) 我相信我可以编写自定义反序列化程序,但我觉得一定有更简单的方法。 我找到了这个注释,它在没有列表的情况下非常有效。
我想为我们的REST API实现一个自定义的反序列化器,它不仅被Java应用程序使用。因此,我不想让Jackson将类型信息放入序列化的JSON中。 我目前正在努力反序列化<code>CollectionExpand</code>,因为它包含特定<code>ResourceModel</code>的<code>数据</code>列表。 < code>ResourceModel是一个接口,每个< c
问题内容: 我无法找出使用杰克逊实现自定义序列化/反序列化的正确方法。我有很多类(〜50),它们带有应被序列化/反序列化而不是原始的原始字段。喜欢: 所有序列化和反序列化都非常相似,我只需要在整数之后添加一个后缀(C,页面,米等)。 一种简单的方法是在每个这样的字段中添加一对/ 注释并实现它们。但是我最终会得到100个 非常相似的 序列化器/反序列化器。 我想到了添加自定义注释的各个领域,说或,这
可以序列化/反序列化< code >映射吗 在这种特殊情况下,我知道总是,和 - 第三方类(我有序列化器和反序列化器),其他值是盒装原语。 有可能和杰克逊做这样的事吗?使用MapSerializer/MapDeserializer可以做到这一点吗?(我找不到任何例子)
假设您有一个JSON,它看起来像这样: 使用Scala和类型来表示这一点似乎很自然: 我的问题是:是否可以使用Jackson的Scala模块将上面的JSON序列化为一个? 我的尝试: 例外情况: 线程“main”com.fasterxml.jackson.databind.JsonMappingExctive中的异常:无法构造...项目的实例,问题:抽象类型需要映射到具体类型,具有自定义反序列化器