我有一个Model对象组
public class Group { String title; Listmembers; String createdBy; }
我正在使用Jackson来序列化这个对象.而不是序列化列表"成员"中的整个用户对象,我想序列化只是user.getTitle()
字段.基本上我想要HashMap就像
{ "title" : "sometitle" "members" : [user1.getTitle(), user2.getTitle()] }
我为此编写了一个自定义序列化器
public class GroupSerializer extends JsonSerializer{ @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的字段而不是整个用户对象?
我建议您查看Jackson的Converter
界面,这似乎比创建自定义序列化程序更适合任务.
一种方法是创建Converter
实例并将其添加到实例中ObjectMapper
,以便将其用于所有User
实例的序列化.
public class UserConverter extends StdConverter{ @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) Listmembers; String createdBy; }
并有一个相应的转换器看起来像这样:
public class ListUserConverter extends StdConverter, List
> { @Override public List convert(List users) { return users.stream().map(User::getTitle).collect(Collectors.toList()); } }