用于序列化List< User>的自定义序列化器在List< String>中 [英] Custom serializer for serializing a List<User> in List<String>

查看:136
本文介绍了用于序列化List< User>的自定义序列化器在List< String>中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Model对象组

I've a Model object Group

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

我正在使用Jackson来序列化这个对象。我没有在列表members中序列化整个User对象,而是想要序列化 user.getTitle()字段。
基本上我希望HashMap类似于

I'm using Jackson to serialize this Object. Instead of serializing the whole User object in list "members" I want to serializer just the user.getTitle() field. Basically I want a HashMap to be something like

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

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

I've written a custom serializer for this

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()
        }
   }
}

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

But it's not working. How do I serialize only a field of List instead of whole User Object?

推荐答案

我建议您查看Jackson的 转换器 界面,它似乎比创建自定义序列化程序更适合任务。

I suggest that you look into Jackson's Converter interface, which seems more suited to the task than creating a custom serializer.

创建的一种方法转换器实例并将其添加到 ObjectMapper ,以便它将用于序列化所有用户实例。

One approach it to create a Converter instance and add it to the ObjectMapper, so that it will be used for the serialization of all User instances.

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

另一种方法,万一你不想转换所有用户实例到字符串,是用这样的转换器注释所选属性:

Another approach, in case you don't want to convert all User instances to String, is to annotate selected properties with a converter like this:

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

并且有一个相应的转换器,如下所示:

And have a corresponding converter that looks something like this:

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

这篇关于用于序列化List&lt; User&gt;的自定义序列化器在List&lt; String&gt;中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆