簡體   English   中英

將JSON鍵值對映射到HashMap

[英]Mapping a JSON key value pair to HashMap

我試圖將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;
}

您的問題在於recipient_status ,您應該將其更改為recipientStatus 您的JSON應與POJO變量名稱匹配。 無需做一些特殊的事情來制作HashMap

問題可能在於recipientStatus屬性名稱。 Message對象中的名稱與JSON之間沒有匹配項。 有多種方法可以解決此問題:

  1. 正如@ddarellis建議的那樣,在Java類或JSON中重命名屬性,以便它們匹配。

  2. 使用@JsonProperty注釋標記Java屬性

     public class Message { @JsonProperty("recipient_status") private Map<String, String> recipientStatus; } 
  3. 通過修改ObjectMapper將反序列化器上的PropertyNamingStrategy設置為SNAKE_CASE

     new ObjectMapper().setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); 

    或者使用JsonNaming注釋

     @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) public class Message { private Map<String, String> recipientStatus; } 

我認為在你的情況下,第三種選擇更可取。 您已經在此命名策略中擁有兩個屬性,並且在不考慮您需要添加另一個JsonProperty情況下添加新字段會更容易。 此外,可以針對整個應用程序全局設置此策略。

如果您不確定該問題,請使用http://json2csharp.com/ website檢查生成的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",
 }

而json2csharp.com的生成器將運行良好: 在此輸入圖像描述

認為您需要對生成的類進行一些修正。 希望有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM