序列化json时的动态属性名称

时间:2020-06-11 15:18:44

标签: java json jackson

使用Spring Boot Web开发REST Api,我想使用Jackson将具有动态属性的类返回给RepsonseEntity。当返回带有Persons的数组列表时,结果需要类似于

{
  "pages" : 1,
  "pageSize" : 20,
  "persons" : []
}

返回带有动物的列表时,它的外观应类似于

{
  "pages" : 1,
  "pageSize" : 20,
  "animals" : []
}

我现在有一个课程

public class APIResponse { 
  private int pages;
  private int pageSize;
  private List<T> list;
  ...
}

@JsonProperty不会剪切,因为它不是动态的。 @JsonSerialize(使用= CustomSerializer.class)也不会削减它,因为它只允许我用其他标签“包装”值。我在这里用尽所有选项,因此寻求帮助。我的最后一招是返回实现此功能的HashMap,但我只是不喜欢它的外观。有谁知道这是否可以使用杰克逊来完成。其他框架不是一种选择:-(。

2 个答案:

答案 0 :(得分:1)

您必须为整个类编写一个自定义的序列化程序,即JsonSerializer

有关更多信息,请检查以下内容:jackson-custom-serialization-on-class

有关更多信息,请检查以下内容:jackson-dynamic-property-names

答案 1 :(得分:0)

经过一番挖掘,我找到了以下解决方案

public class ApiResponse { 
  private int pages;
  private int pageSize;


  ...
}

...
ApiResponse response = new ApiResponse();
...
List<Person> persons = new ArrayList<>();
...
//convert object to json
ObjectMapper mapper = new ObjectMapper(); 
JsonNode jsonNode = mapper.valueToTree(response);
objectNode = jsonNode.deepCopy();
//add the dynamic property
objectNode.set(resourceName, mapper.valueToTree(persons));
String json = mapper.writeValueAsString(node);