我正在尝试将json中的键值对(recipient_status
)映射到Map<String, String>
对象。除了这一个,所有字段都被正确解析。还有另一种解析键值对的方法吗?
我发送以下JSON字符串:
{
"id": "layer:///messages/940de862-3c96-11e4-baad-164230d1df67",
"parts": [
{
"id": "layer:///messages/940de862-3c96-11e4-baad-164230d1df67/parts/0",
"mime_type": "text/plain",
"body": "This is the message."
}
],
"sent_at": "2014-09-09T04:44:47+00:00",
"recipient_status": {
"layer:///identities/777": "sent",
"layer:///identities/999": "read",
"layer:///identities/111": "delivered",
"layer:///identities/1234": "read"
},
"position": 120709792
}
到我的Java Sprint Boot后端
@RequestMapping(method = RequestMethod.POST, value = "/")
public String conversationCreated(@RequestBody Message message) {
}
并尝试将其解析为以下对象:
@Data
public class Message {
private String id;
private List<Part> parts;
private LocalDateTime sentAt;
private Map<String, String> recipientStatus;
private Long position;
}
答案 0 :(得分:0)
您的问题出现在recipient_status
,您应该将其更改为recipientStatus
。您的JSON应与POJO变量名称匹配。无需做一些特殊的事情来制作HashMap
。
答案 1 :(得分:0)
问题可能在于recipientStatus
属性名称。 Message
对象中的名称与JSON之间不匹配。有多种方法可以解决这个问题:
正如@ddarell所建议的那样,在Java类或JSON中重命名属性,以便它们匹配。
使用@JsonProperty
注释标记Java属性
public class Message {
@JsonProperty("recipient_status")
private Map<String, String> recipientStatus;
}
通过修改PropertyNamingStrategy
SNAKE_CASE
设置为ObjectMapper
new ObjectMapper().setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
或使用JsonNaming
注释
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Message {
private Map<String, String> recipientStatus;
}
我认为在你的情况下,第三种选择更可取。您已在此命名策略中拥有两个属性,并且在不考虑您需要添加另一个JsonProperty
的情况下添加新字段会更容易。此外,可以针对整个应用程序全局设置此策略。
答案 2 :(得分:-1)
如果您不确定该问题,请使用http://json2csharp.com/网站检查您生成的json类,如下所示:
看什么? json完全支持我的生成器,它无法转换json。
所以在这里,您需要更改json片段中的recipient_status部分。
建议:
将recipient_status更改为以下内容:
"recipient_status": {
"sent":"layer:///identities/777",
"read":["layer:///identities/999","layer:///identities/1234"],
"delivered":"layer:///identities/111",
}
认为您需要对生成的类进行一些修正。 希望有所帮助。