java - 用于序列化 List<String> 中的 List<User> 的自定义序列化程序

标签 java android serialization jackson

我有一个模型对象组

public class Group {
    String title;
    List<User> members;
    String createdBy;
}

我正在使用 Jackson 序列化此对象。我不想序列化列表“成员”中的整个用户对象,而是只想序列化 user.getTitle() 字段。 基本上我想要一个 HashMap 像

{
  "title" : "sometitle"
  "members" : [user1.getTitle(), user2.getTitle()]
}

我为此编写了一个自定义序列化程序

public class GroupSerializer extends JsonSerializer<Circle> {

    @Override
    public void serialize(Group value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {

        if(value != null) {
            gen.writeStartObject();
            gen.writeStringField("title", value.getTitle());
            gen.writeStringField("createdBy", value.getCreatedBy());
            gen.writeFieldName("members");
            gen.writeStartArray();
            for(User user : value.getMembers()) {
                gen.writeString(user.getEmail());
            }
            gen.writeEndArray();
            gen.writeEndObject()
        }
   }
}

但它不起作用。如何只序列化列表的一个字段而不是整个用户对象?

最佳答案

我建议您查看 Jackson 的 Converter接口(interface),这似乎比创建自定义序列化程序更适合该任务。

一种方法是创建一个 Converter 实例并将其添加到 ObjectMapper 中,这样它将用于所有 User 的序列化> 实例。

public class UserConverter extends StdConverter<User, String> {
    @Override
    public String convert(User user) {
        return user.getTitle();
    }
}

像这样在您的 ObjectMapper 上注册它:

SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(User.class, new StdDelegatingSerializer(new UserConverter()));

ObjectMapper om = new ObjectMapper().registerModule(simpleModule);

如果您不想将所有 User 实例转换为 String,另一种方法是使用这样的转换器注释选定的属性:

public class Group {
    String title;
    @JsonSerialize(converter = ListUserConverter.class)
    List<User> members;
    String createdBy;
}

并有一个看起来像这样的相应转换器:

public class ListUserConverter extends StdConverter<List<User>, List<String>> {
    @Override
    public List<String> convert(List<User> users) {
        return users.stream().map(User::getTitle).collect(Collectors.toList());
    }
}

关于java - 用于序列化 List<String> 中的 List<User> 的自定义序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41649932/

相关文章:

java - 无法从外部项目获取bean

java - 在 Android 上使用 JavaMail 验证电子邮件

android - 将 parcelable 类保存到文件中

jquery - 使用动态和静态输入php序列化并插入到mysql表单

java - 使用 XStream 序列化为 XML 但未获取所有字段

java - 为什么需要ReaderLock?

java - 如何在运行时检查服务器的 "JVM/CPU/Memory"?

java - 函数和可运行对象同时工作(如何?)(Android、Java)

android - 自定义 Android WebView 以在内部打开除 YouTube 链接之外的所有链接

android - 如何获取按钮的背景颜色