【发布时间】:2020-06-12 22:11:26
【问题描述】:
我正在将 json 转换为 java 对象,但我没有得到我想要的。 我在我的 json 中复制了“朋友”键。
我的 json:
{
"id" : "5ee2e2f780bc8e7511a65de9",
"friends": [{
"friend": {
"id": 1,
"name": "Priscilla Lynch"
},
"friend": {
"id": 2,
"name": "William Lawrence"
}
}]
}
使用 ObjectMapper 中的 readValue 只需要最后一个“朋友”,但我需要两者。 我知道 JSONObject 使用 Map 进行转换,所以这就是它采用最后一个的原因。
结果: 联系人(id=5ee2e2f780bc8e7511a65de9,朋友=[{朋友={id=2,姓名=威廉劳伦斯}}])
ObjectMapper mapper = new ObjectMapper();
Contacts contacts = mapper.readValue(json, Contacts.class);
联系Pojo:
@Getter
@Setter
@ToString
public class Contacts {
String id;
List<Object> friends;
}
我想要一份所有朋友的名单。作为提供 json 的服务不在我手中,我需要找到解决它的方法。 我尝试使用 apache.commons 中的 MultiMap 但没有成功。 我坚持这一点。
【问题讨论】:
-
您需要
Friend作为对象吗?因为您可以从JsonNode中提取它们而无需反序列化它们。 -
是的,我需要朋友列表
-
你的 json 有点奇怪。您在同一节点中有 2 个名称相同的字段
friend。这使得杰克逊只选择其中一个(最后一个)。因此,即使您使用 JsonNode 处理它,第一个friend也会丢失。你可以执行这个JsonNode jsonNode = mapper.readTree(json); System.out.println(jsonNode.get("friends").get(0).toString());它打印数组friends的第一个元素。它只打印一个,而不是两个。在我看来,json 是“错误的”。你的friends是这样的[ { {}, {} } ] -
@KunLun,
JSON有效载荷有效。对象结构表示为一对围绕零个或多个名称/值对的花括号标记。名称是一个字符串。每个名称后面都有一个冒号标记,将名称与值分开。单个逗号标记将值与后面的名称分开。 JSON 语法对用作名称的字符串不施加任何限制,不要求名称字符串是唯一的,并且不对名称/值对的顺序赋予任何意义。 Source
标签: java json jackson jackson-databind