【问题标题】:Serialize a class to json in diffrent ways以不同的方式将一个类序列化为 json
【发布时间】:2018-09-24 18:27:55
【问题描述】:

有没有办法将一个类序列化为 json,但只有在特定情况下我想使用的字段而不需要创建类的多个变体? 举个例子:

class User{

    @JsonField
    private String name;

    @JsonField
    private String surname;

    @JsonField
    private String hashedCode;

    @JsonField
    private String city;

    @JsonField
    private String anotherDummyString;
}

现在,在我的一种方法中,我希望映射到仅包含 namecityanotherDummyString 的 json 对象。

在第二种方法中,我想要 surnamecity。第三种方法... .

是否有任何愉快而简洁的方法来实现这一目标? 我想知道是否可以“隐藏”这些不需要的字段。

【问题讨论】:

标签: java json serialization


【解决方案1】:

您正在寻找这样的东西吗? (使用 javax.json)

JsonObject getJson1() {
    return Json.createObjectBuilder().add("name", this.name).add("city", this.city).build();
}
JsonObject getJson2() {
    return Json.createObjectBuilder().add("surname", this.surname).add("city", this.city).build();
}

只需.add 每个函数调用所需的内容。

【讨论】:

    【解决方案2】:

    我希望您正在为您在 Class 中的字段寻找一种过滤器

    这可以使用 Jackson @JsonFilter 来实现

    package com.concretepage;
    import com.fasterxml.jackson.annotation.JsonFilter;
    import com.fasterxml.jackson.annotation.JsonProperty;
    
    @JsonFilter("student")
    public class Student 
    {
        @JsonProperty("name")
        private String name;
    
        @JsonProperty("surname")    
        private String surname;
    
        @JsonProperty("hashedCode") 
        private String hashedCode;
    
        @JsonProperty("city")   
        private String city;
    
        @JsonProperty("anotherDummyString") 
        private String anotherDummyString;
    
    }  
    

    为你上面的类创建一个简单的过滤器

    SimpleFilterProvider filterProvider = new SimpleFilterProvider();
    filterProvider.addFilter("student",
            SimpleBeanPropertyFilter.serializeAllExcept("name", "city","anotherDummyString")); 
    

    将其设置为对象映射器

    ObjectMapper mapper = new ObjectMapper();
    mapper.setFilterProvider(filterProvider); 
    

    获取json消息

    //Pass the student object  
    String jsonData = mapper.writerWithDefaultPrettyPrinter()
                   .writeValueAsString(student);
    

    您必须能够通过创建一个以上示例过滤器来获得 2 个类的方差

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多