Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 序列化json时的动态属性名称_Java_Json_Jackson - Fatal编程技术网

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

Java 序列化json时的动态属性名称,java,json,jackson,Java,Json,Jackson,在使用SpringBootWeb开发RESTAPI时,我想使用Jackson向具有动态属性的RepsonseEntity返回一个类。返回包含人员的数组列表时,结果需要如下所示 { "pages" : 1, "pageSize" : 20, "persons" : [] } { "pages" : 1, "pageSize" : 20, "animals" : [] } 当返回动物列表时,它需要看起来像 { "pages" : 1, "pageSize" : 2

在使用SpringBootWeb开发RESTAPI时,我想使用Jackson向具有动态属性的RepsonseEntity返回一个类。返回包含人员的数组列表时,结果需要如下所示

{
  "pages" : 1,
  "pageSize" : 20,
  "persons" : []
}
{
  "pages" : 1,
  "pageSize" : 20,
  "animals" : []
}
当返回动物列表时,它需要看起来像

{
  "pages" : 1,
  "pageSize" : 20,
  "persons" : []
}
{
  "pages" : 1,
  "pageSize" : 20,
  "animals" : []
}
我现在有课了

公共类响应{ 私人网页; 私有int页面大小; 私人名单; ... }
@JsonProperty不会剪切,因为它不是动态的。@JsonSerializeusing=CustomSerializer.class也不会剪切它,因为它只允许我用其他标记“包装”该值。我在这里没有选择了,所以需要帮助。我的最后一个办法是返回一个HashMap,它会起作用,但我就是不喜欢它的外观。有人知道用杰克逊能不能做到这一点吗。其他框架不是选项:-.

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

有关更多信息,请查看以下内容:


有关更多信息,请查看此项:

经过一番挖掘后,我采用以下解决方案

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

也许它可以帮助Hi Juan,正如我在问题中提到的:HashMap可以做到这一点,但我更希望看到自定义对象/类。答案可能是,这不可能是我想要的。但也许这很容易做到。正如我所说的,我已经试过了。CustomSerializer将允许您动态地将标记添加到属性中,而不是添加到属性本身。该链接显示属性的名称p。这是我想要改变的。虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-类上的序列化示例实现了这一点!我喜欢这个解决方案,谢谢!