【问题标题】:Rest Template binding with root arrayRest Template 与根数组绑定
【发布时间】:2018-02-26 15:48:02
【问题描述】:

我正在尝试使用 Rest Template 将 JSON 绑定到 POJO。

假设有一个SpaceX 类和一个Rocket 类,而SpaceX 类有一个List<Rocket> 属性。我使用@JsonProperty 注释让Rest Template 自动绑定Rocket 对象内的“Rocket ID”和“名称”。

我的 JSON 文件以数组开头,如下所示:

[
  {
    "Rocket ID": "1",
     "name": "A"
  },
  {
    "Rocket ID": "2",
     "name": "B"
  }
]

我可以使用 JSON 文件并像这样手动填写 List<Rocket>

public <T> List<T> createObjectsFromJSON(Class<T[]> responseType) {
    ResponseEntity<T[]> responseEntity = restTemplate.exchange(URL, HttpMethod.GET, request, responseType);
    T[] objects = responseEntity.getBody();
    List<T> list = Arrays.asList(objects);
    return list;
}

但我想创建一个SpaceXobject 并让Rest Template 自动填充List&lt;Rocket&gt;。 我无法回答如何做到这一点。我不能告诉 Rest Template 通过@JsonProperty 绑定列表,因为没有名称。

【问题讨论】:

  • 你的意思是在不改变json结构的情况下,你想接受SpaceX对象而不是List
  • @pvpkiran 是的,无法编辑 JSON 结构,因为我正在使用 API 来获取它。

标签: java json spring jackson resttemplate


【解决方案1】:

如果您无法更改 JSON 结构,则必须编写自定义序列化和反序列化逻辑。您可以使用@JsonCreator 和@JsonValue 注释:

@JsonCreator 注解用于调整构造函数/工厂 用于反序列化。当我们需要反序列化时非常有用 一些与我们需要获取的目标实体不完全匹配的 JSON。

@JsonValue 表示应该用于序列化的单个方法 整个实例。

或者@JsonSerialize 和@JsonDeserialize:

@JsonSerialize 用于指示将使用自定义序列化程序 编组实体。

@JsonDeserialize 用于指示使用自定义反序列化器。

本文包含更多细节和示例:http://www.baeldung.com/jackson-annotations

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 2011-05-25
    • 2011-03-26
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2013-04-20
    • 2011-09-25
    • 1970-01-01
    相关资源
    最近更新 更多