Java 将JSON键值对映射到HashMap

Java 将JSON键值对映射到HashMap,java,json,spring-boot,Java,Json,Spring Boot,我试图将json中的一个键值对,recipient\u status映射到一个map对象。除此之外,所有字段都被正确解析。有没有其他方法可以解析键值对 我正在发送以下JSON字符串: { "id": "layer:///messages/940de862-3c96-11e4-baad-164230d1df67", "parts": [ { "id": "layer:///messages/940de862-3c96-11e4-baad-164230d1df67/par

我试图将json中的一个键值对,
recipient\u status
映射到一个
map
对象。除此之外,所有字段都被正确解析。有没有其他方法可以解析键值对

我正在发送以下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启动后端

@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;
}
@数据
公共类消息{
私有字符串id;
私人零件清单;
私有LocalDateTime sentAt;
私有地图接收者状态;
私人多头头寸;
}

您的问题在于
收件人状态
,您应该将其更改为
收件人状态
。JSON应该与POJO变量名匹配。无需执行特殊操作来创建
HashMap

问题可能在于
recipientStatus
属性名。
消息中的名称与JSON不匹配。有多种方法可以解决此问题:

  • 正如@ddarellis所建议的,在Java类或JSON中重命名属性,以便它们匹配

  • @JsonProperty
    注释标记Java属性

    public class Message {
        @JsonProperty("recipient_status")
        private Map<String, String> recipientStatus;
    }
    
    或者使用
    JsonNaming
    注释

    @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
    public class Message {
        private Map<String, String> recipientStatus;
    }
    
    @JsonNaming(PropertyNamingStrategy.snakecasestractegy.class)
    公共类消息{
    私有地图接收者状态;
    }
    

  • 我认为在你的情况下,第三种选择更可取。在这个命名策略中,您已经有了两个属性,添加新字段将更容易,而不必考虑需要添加另一个
    JsonProperty
    。此外,可以为整个应用程序全局设置此策略。

    如果您不确定此问题,请使用网站检查生成的json类,如下所示:

    看什么?json完全是我的生成器,它无法转换json

    因此,在这里,您需要更改json片段中的recipient_status部分

    建议:

    将收件人状态更改为以下状态:

     "recipient_status": {
         "sent":"layer:///identities/777",
         "read":["layer:///identities/999","layer:///identities/1234"],
         "delivered":"layer:///identities/111",
     }
    
    来自json2csharp.com的生成器将运行良好:

    认为您需要对生成的类进行一些更正。
    希望对您有所帮助。

    试试私人地图recipientStatus;尝试将map对象替换为`JsonObject``并查看它是否正确works@vikaskumar,那也不行。recipientStatus保持为null。与您的解决方案相同@mehdimaick。将recipientStatus替换为Object,并检查其是否为null,或者将其替换为Map并再次测试。
     "recipient_status": {
         "sent":"layer:///identities/777",
         "read":["layer:///identities/999","layer:///identities/1234"],
         "delivered":"layer:///identities/111",
     }