gpt4 book ai didi

java - 使用 Jackson 将列表和对象反序列化为相同的结构

转载 作者:太空宇宙 更新时间:2023-11-04 09:03:10 24 4
gpt4 key购买 nike

作为我的应用程序的输入,我可能会得到一个 JsonObject,或者它们的列表:

input1 = [ { "prop": "val1" }, { "prop": "val2" } ]
input2 = { "prop": "val" }

我可以使用JsonNode作为两个输入的目标类型

objectMapper.readValue(input1, JsonNode.class);
objectMapper.readValue(input2, JsonNode.class);

然后评估根节点是否是ArrayNodeObjectNode .

我寻求一种方法来定义我的自定义目标类型,例如 List<MyObject>如果提供了 JsonObject,则有一个 Element;如果提供了 List,则有零到多个。

objectMapper.readValue(input, new TypeRef<ArrayList<MyObject>>() {});

但是对于单个对象失败 - 它无法从 {.

构造数组类型

我试图创建自己的类型:

public class MyList extends ArrayList<MyObject> {
public String prop;

@JsonCreator
public MyList(String prop) {
super();
this.prop = prop; // Resp add(new MyObject(prop));
}

public MyList() {}
}

但是 Jackson 拒绝将 JsonCreator 用于单个对象。

有什么办法,我可以做到这一点(理想情况下没有自定义序列化器,除非该序列化器可以变得非常通用)

最佳答案

当然, jackson 对此有一个简单的解决方案:
DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY to your help!

@EqualsAndHashCode
public class Example {
@JsonProperty public String name
}

@Test
public void experiment() {
ObjectMapper om = new ObjectMapper();
om.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);

String list= "[{ \"name\": \"peter\" }]";
String single= "{ \"name\": \"peter\" }";

List<Example> respList = om.readValue(list, new TypeReference<List<Example>>() {});
List<Example> respSingle = om.readValue(single, new TypeReference<List<Example>>() {});
Assert.assertEquals(respList, respSingle)
}

关于java - 使用 Jackson 将列表和对象反序列化为相同的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60531521/

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