【问题标题】:How to works with two json formats with Jackson如何与杰克逊一起使用两种 json 格式
【发布时间】:2019-12-17 10:03:47
【问题描述】:

我有字段names

private List<String> names;

我得到的 Json 看起来像:

"names": [
 {
   "name": "a",
 },
 {
   "name": "b",
 },
 {
   "name": "c",
 }
]

所以我使用自定义序列化将此 json 转换为 List:

@JsonProperty("names")
private void deserializeNames(List<Map<String, String>> json) {
    names = json.stream().map(e -> e.get("name")).collect(Collectors.toList());
}

这个解决方案有效,但是当我想序列化我的类的对象时,新的 json 看起来像:

"names": [
  "a",
  "b",
  "c"
]

我的自定义序列化代码无法使用它,因为它需要 Map 而不是 List

我尝试使用instanceof 或反序列化列表映射来解决问题,但我认为这是一个错误的解决方案。 这个问题有什么简单的解决方案吗?

【问题讨论】:

  • Json 和类字段不匹配,该字段不会产生这样的 Json。
  • @amer 是的,我明白了。但我很高兴找到同时使用两种格式的解决方案
  • 我的建议是不要使用List&lt;Map&lt;String, String&gt;&gt; json 作为名称列表,没有必要,只使用List&lt;String&gt; 或者如果你必须使用&lt;Map&lt;String, String&gt;。但是使用 List od Maps 是多余的。
  • @amer 这是我从第三方来源获得的数据格式。我不控制它。
  • 然后试试这样的:Map&lt;String,String&gt; map = new HashMap&lt;&gt;(); for(String name:json){ map.put("name",name); }

标签: java json serialization jackson deserialization


【解决方案1】:

您无需为此编写自定义反序列化器, 你可以定义一个类,

class Name {
   @JsonProperty("name")
   String name;
   Name () {
   }
} 

你可以使用,

@JsonProperty("names")
private List<Name> names;

这将自动反序列化。在序列化时它会做同样的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多