当前位置: 首页 > 知识库问答 >
问题:

用于在列表

公冶伟
2023-03-14

我有一个模型对象组

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

我正在使用Jackson序列化此对象。我只想序列化用户,而不是序列化列表“members”中的整个用户对象。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()
        }
   }
}

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

共有2个答案

琴正初
2023-03-14

尝试以下操作:

“组:”

@JsonIgnoreProperties(ignoreUnknown=true)
public class Group {

    @JsonSerialize(using= TitleSerializer.class)    
    List<User> members;

   //getters and setters 
}

用户:

public class User {

    private String title;

    //getters and setters
}

自定义序列化程序:

public class TitleSerializer extends StdSerializer<List<User>> {


    private static List<User> users=new ArrayList<User>();

    protected TitleSerializer(Class<List<User>> t) {
        super(t);
        // TODO Auto-generated constructor stub
    }

    @SuppressWarnings("unchecked")
    public TitleSerializer(){
          this((Class<List<User>>) users.getClass());     

    }

    @Override
    public void serialize(List<User> users, JsonGenerator paramJsonGenerator,
            SerializerProvider paramSerializerProvider) throws IOException {

        paramJsonGenerator.writeStartObject();
        List<String> titles=new ArrayList<String>(users.size());
        for(User user: users){
            titles.add(user.getTitle());
        }
        paramJsonGenerator.writeObjectField("members", titles);
        paramJsonGenerator.writeEndObject();
    }

}

测试:

Group group=new Group(Arrays.asList(new User("a"),new User("b"),new User("c")));
ObjectMapper mapper = new ObjectMapper();       
String serialized = mapper.writeValueAsString(group);
System.out.println("output "+serialized);

输出:

{"members":["a","b","c"]}
怀晋
2023-03-14

我建议您研究一下Jackson的转换器接口,它似乎比创建自定义序列化程序更适合此任务。

一种方法是创建一个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);

如果不想将所有用户实例转换为字符串,另一种方法是使用如下转换器注释选定的属性:

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());
    }
}
 类似资料:
  • 问题内容: 我有一堂课 我应该如何为int列表提供输入JSON,因为它没有匹配其值的键 JSON格式 我应该在ItemModList中写什么 问题答案: 假设您的整数是0、375、668,5和6: 我建议您将“ Id”:“ 610”更改为“ Id”:610,因为它是整数/长整数而不是字符串。您可以在http://json.org/上阅读有关JSON格式和示例的更多信息。

  • 我有以下问题,因为我是pyspark的新手。基于来自两列的值的条件,我想填充第三列。条件是: < li >如果分号包含在col2中,请检查col1 < ul > < li >如果col1 == 1,则取分号前的值 < li >如果col1 == 2,则取分号后的值 这就是数据帧的样子。 我创建了下面的udf,它给出了错误“不能将列转换为布尔值:请使用” 我通过谷歌搜索各种功能构建了这个udf,所以

  • 问题内容: 我正在使用Spring Boot 1.4.3 ,根据用户指定的属性自动创建bean。用户可以指定一系列服务,其中 名称 和 版本 为必填字段: 如果用户忘记了甚至只在一项服务上都指定了必填字段,那么我想回退而不创建任何bean。我可以用吗?我想要类似的东西: 问题答案: 这是我创建的风俗。它需要一些修饰才能更通用(即,不对字符串进行硬编码),但对我来说效果很好。 要使用,我用以下注释了

  • 如果输入数据看起来像这样: 我怎样才能把它变成这样?

  • 问题内容: 我编写了一个程序来查找给定项目列表的所有可能排列。这恰恰意味着我的程序会打印出r = 0到n的所有可能的P(n,r)值 下面是代码: `` 输出量 我的问题是,随着我增加输入列表中的数字。运行时间增加,并且在输入列表中输入11个数字后,程序几乎消失了。运行大约需要2 GB内存。 我正在具有8GB RAM和i5处理器的计算机上运行此程序,因此速度和空间不是问题。 如果有人可以帮助我编写更

  • 假设我有这个命令代码: 我该如何以函数式的方式写这篇文章(就像fold在Scala中做的那样)?