【问题标题】:Use jackson annotation on a field to be the root for deserialization在字段上使用杰克逊注解作为反序列化的根
【发布时间】:2018-11-13 07:07:04
【问题描述】:

我有一个想要反序列化的类:

@Data
public class Config {

    private Map<String, Item> items;
}

@Data
public class Item {

    private String a;
    private String b;
    private String c;
}

JSON 字符串:

{
  "item1": {
    "a": "1",
    "b": "2",
    "c": "3"
  },
  "item2": {
    "a": "10",
    "b": "20",
    "c": "30"
  },
  "item3": {
    "a": "5",
    "b": "6",
    "c": "7"
  }
}

我应该使用什么来将 JSON 字符串反序列化为 Config?

编辑:向 JSON 添加更多项目

【问题讨论】:

  • itemsitem1 不匹配
  • 不要在声明端使用HashMap,这是一种不好的做法。而是使用Map
  • 你能显示Item类吗?只有字符串字段作为属性?
  • 使用 Map 并添加了 Item 类。

标签: java json jackson annotations


【解决方案1】:

更新

使用JsonAlias 获取单个属性中的多个值:

@JsonAlias({"item1", "item2", "item3"})
private Map<String, Item> items;

可用于为属性定义一个或多个替代名称的注释

旧问题的旧答案

添加JsonProperty 名称为item1

@Data
public class Config {
    @JsonProperty("item1")
    private Map<String, Item> items;
}

可用于将非静态方法定义为逻辑属性(取决于其签名)或要使用的非静态对象字段(序列化、反序列化)的“setter”或“getter”的标记注释作为一个逻辑属性。

编辑

在@michaeak 评论后更新为Map

【讨论】:

  • 感谢您的回答,但我应该让示例更清楚。有多个项目。
【解决方案2】:

一位同事帮助我回答了我的问题:

@Data
public class Config {

    private Map<String, Item> items;

    @JsonAnyGetter
    public Map<String, Item> getItems() {
       return items;
    }

    @JsonAnySetter
    public void setItem(final String key, final Item value) {
       items.put(key, value);
    }
}

@Data
public class Item {

    private String a;
    private String b;
    private String c;
}

【讨论】:

    猜你喜欢
    • 2015-05-18
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多