java - Jackson JSON - 用不同的逻辑序列化相同的对象

标签 java json jackson

假设您有一个具有许多字段的对象 A,其中一个字段是唯一标识该对象的 id。在我的java代码中,有一个对象B,它以类似于此代码的几个数据结构保存这些对象:

private List<A> all;
private Map<Long, A> mapped;

现在,当将 B 序列化为 json 时,我只希望列表 all 中的对象 A 使用所有字段进行序列化,而映射 mapped 中的对象仅使用 id 字段进行序列化。你会怎么做?

最佳答案

您可以实现StdConverter接口(interface):

public class YourConverter implements StdConverter<Map<Long, A>, Map<Long, String>> {
  @Override
  public Map<Long, String> convert(final Map<Long, A> inMap) {
    final HashMap<Long, String> outMap = new HashMap<>();
    inMap.forEach((k, v) -> outMap.put(k, v.getId()));
    return outMap;
    // Or as one-liner
    // return inMap.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getId()));
  }
}

然后您可以将转换器添加为 JsonSerialize 注释:

private List<A> all;
@JsonSerialize(converter = YourConverter.class)
private Map<Long, A> mapped;

关于java - Jackson JSON - 用不同的逻辑序列化相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49572922/

相关文章:

java - 将数据格式化为 JSON

java - 使用 Jackson 反序列化 XML 以从 XSD 生成选择时出错

android - JsonSubTypes,多态对象列表和 Parcelable

java - 如何编写 java 库的 python 包装器

java - 当 main 方法包含在类中时,我的程序可以编译,但当 main 方法是单独的时则不能编译

php - 选择2 添加带有确认框的新标签

json - 如何在 Confluence Rest Api 创建的页面中插入一个 confluence 宏?

java - 在同一项目中使用 java 和 .net

java - 类路径或引导类路径中的 fatal error : Unable to find package java. lang

JavaScript/JSON - 从多个数组中获取具有相同键的值的总平均值