【问题标题】:Dynamic property name when serializing json序列化json时的动态属性名
【发布时间】:2020-06-11 15:18:44
【问题描述】:

使用 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(using = CustomSerializer.class) 也不会削减它,因为它只允许我用其他标签“包装”该值。我在这里没有选择,所以寻求帮助。我最后的手段是返回一个可以解决问题的 HashMap,但我根本不喜欢它的外观。有谁知道这是否可以使用杰克逊来完成。其他框架不是一个选项:-(。

【问题讨论】:

  • 嗨,胡安,正如我在问题中提到的那样:HashMap 可以解决问题,但我更希望看到一个自定义的 Object/ 类。答案可能是它不可能是我想要的。但也许它可以很容易地完成。

标签: java json jackson


【解决方案1】:

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

欲了解更多信息,请查看:jackson-custom-serialization-on-class

欲了解更多信息,请查看:jackson-dynamic-property-names

【讨论】:

  • 如前所述,我已经尝试过了。 CustomSerializer 将允许您动态地向属性添加标签,而不是它自己的属性。该链接显示属性的名称“p”。是我想改变。
  • 类示例的序列化可以解决问题!我喜欢这个解决方案,谢谢!
【解决方案2】:

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

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多