【问题标题】:Is there a built in way to deserialize Map<String,String> in Jackson是否有内置的方法来反序列化杰克逊中的 Map<String,String>
【发布时间】:2022-01-22 19:25:57
【问题描述】:

API 正在返回这样的地图条目数组

[
{"key":"Key1","value":"Value1"},
{"key":"Key2","value":"Value2"}, 
{"key":"Key3","value":"Value3"},
....
]

我想直接反序列化成Map&lt;String,String&gt; 所以它会变成

Map<String,String> {Key1->Value1, Key2->Value2, Key3->Value3}

明显的解决方案是反序列化为List&lt;ApiMapEntry&gt;,但也许有更简单的方法?

我现在在做什么:

@JsonProperty
public void setMyTargetMap(List<ApiMapEntryWrapper> wrappers) {
    this.myTargetMap= wrappers.stream().collect(Collectors.toMap(ApiMapEntryWrapper::getKey, ApiMapEntryWrapper::getValue));
}

class ApiMapEntryWrapper{
   private String key;
   private String value;
}

虽然我会在不需要ApiMapEntryWrapper 的情况下寻找类似(参考示例 json)的东西

@JsonMap(keyName="key",valueName="value")
private Map<String,Strin> myTargetMap

【问题讨论】:

    标签: java spring jackson


    【解决方案1】:

    Jackson 默认可以反序列化为Map&lt;String, String&gt;。所以默认情况下应该可以使用以下内容。

    @GetMapping
    public void getSomething(@RequestBody Map<String,String> map) {
          ....
    }
    

    但您的情况似乎有所不同,因为您希望 List 中有多个 JSON 对象,其重复信息为 key:somekey,value:somevaluekeyvalue 是列表中每个对象的重复信息。

    在看到来自 cmets IMO 的更多反馈后,最好的办法是引入一个自定义反序列化,用于将输入 JSON 转换为 Map&lt;String, String&gt;。有关自定义反序列化器和示例的更多信息,请参阅here

    【讨论】:

    • 如果您将映射序列化为映射条目(即 {key:k,value:v} 对象的列表)而不是普通的 json 对象,这是有意义的。杰克逊可以将 JSON 对象序列化为地图,是的,但我正在寻找将对象解构为地图的内置方法。查看我的 sn-p(工作)
    • {"keyName":"keyValue","valueKey":"valueValue"} keyNamevalueKey 有什么好处?这不是地图中每个条目都会存在的重复信息吗?
    • 完成了,现在应该更清楚了。
    • @Antoniossss 用似乎对您的案例可行的解决方案更新了答案。我怀疑是否存在可以为您提供开箱即用的解决方案的注释,因为这个要求至少看起来很奇怪,而不是 API 的预期行为
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 2015-04-07
    相关资源
    最近更新 更多