Java 如何使用Jackson实现动态部分JSON序列化?

Java 如何使用Jackson实现动态部分JSON序列化?,java,json,jackson,Java,Json,Jackson,我有一个POJO,用于跟踪是否显式设置属性的所有属性的自定义setter方法。setter存储到fieldNameSet布尔字段,并为这些标志公开isFieldNameSetgetter我希望Jackson仅使用那些具有isFieldNameSet为true的字段动态序列化类 背景: 我开始编写一个自定义的JsonFilter实现,但它没有给出任何关于当前正在序列化的对象实例的上下文,因此显然我无法读取isFieldNameSet属性的当前值。很快就从一个Jackson示例中被破解了 impor

我有一个POJO,用于跟踪是否显式设置属性的所有属性的自定义setter方法。setter存储到
fieldNameSet
布尔字段,并为这些标志公开
isFieldNameSet
getter我希望Jackson仅使用那些具有
isFieldNameSet
true
的字段动态序列化类

背景:


我开始编写一个自定义的
JsonFilter
实现,但它没有给出任何关于当前正在序列化的对象实例的上下文,因此显然我无法读取
isFieldNameSet
属性的当前值。

很快就从一个Jackson示例中被破解了

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ser.FilterProvider;
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;

public class JacksonExample {
    public static void main(String[] args) {

        ObjectMapper mapper = new ObjectMapper();

        User user = createDummyUser();

        try {

            //Its age here , this is conditional based on your fieldset
            SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept("age");
            FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter);

            // Convert object to JSON string
            String jsonInString = jsonInString = mapper.writer(filters).writeValueAsString(user);
            System.out.println(jsonInString);

            // Convert object to JSON string and pretty print

            //System.out.println(jsonInString);

        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static User createDummyUser() {

        User user = new User();

        user.setName("mkyong");
        user.setAge(33);

        List<String> msg = new ArrayList<>();
        msg.add("hello jackson 1");
        msg.add("hello jackson 2");
        msg.add("hello jackson 3");

        user.setMessages(msg);

        return user;

    }
}


package org.soproject;

import java.util.List;

import org.codehaus.jackson.map.annotate.JsonFilter;

@JsonFilter("myFilter")
public class User {

    private String name;
    private int age;
    private List<String> messages;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<String> getMessages() {
        return messages;
    }

    public void setMessages(List<String> messages) {
        this.messages = messages;
    }

    // getters and setters

}
import org.codehaus.jackson.jsongGenerationException;
导入org.codehaus.jackson.map.JsonMappingException;
导入org.codehaus.jackson.map.ObjectMapper;
导入org.codehaus.jackson.map.ser.FilterProvider;
导入org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
导入org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;
公共类Jacksone示例{
公共静态void main(字符串[]args){
ObjectMapper mapper=新的ObjectMapper();
User User=createDummyUser();
试一试{
//它的年龄在这里,这是有条件的根据您的字段集
SimpleBeanPropertyFilter过滤器=SimpleBeanPropertyFilter.serializeAllExcept(“年龄”);
FilterProviderFilters=新的SimpleFilterProvider().addFilter(“myFilter”,过滤器);
//将对象转换为JSON字符串
字符串jsonInString=jsonInString=mapper.writer(过滤器).writeValueAsString(用户);
System.out.println(jsonInString);
//将对象转换为JSON字符串并打印
//System.out.println(jsonInString);
}捕获(JsonGenerationException e){
e、 printStackTrace();
}捕获(JsonMappingException e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有静态用户createDummyUser(){
用户=新用户();
user.setName(“mkyong”);
用户设置(33);
List msg=new ArrayList();
msg.add(“hello jackson 1”);
msg.add(“hello jackson 2”);
msg.add(“hello jackson 3”);
user.setMessages(msg);
返回用户;
}
}
包org.soproject;
导入java.util.List;
导入org.codehaus.jackson.map.annotate.JsonFilter;
@JsonFilter(“myFilter”)
公共类用户{
私有字符串名称;
私人互联网;
私人列表消息;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
公共列表getMessages(){
返回消息;
}
公共消息(列出消息){
this.messages=消息;
}
//接球手和接球手
}
忽略您看到的年龄:

{“姓名”:“mkyong”,“信息”:[“你好,杰克逊1”,“你好,杰克逊2”,“你好,杰克逊3”]}


注意:jackson的来源是:

从一个jackson的例子中快速入侵

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ser.FilterProvider;
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;

public class JacksonExample {
    public static void main(String[] args) {

        ObjectMapper mapper = new ObjectMapper();

        User user = createDummyUser();

        try {

            //Its age here , this is conditional based on your fieldset
            SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept("age");
            FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter);

            // Convert object to JSON string
            String jsonInString = jsonInString = mapper.writer(filters).writeValueAsString(user);
            System.out.println(jsonInString);

            // Convert object to JSON string and pretty print

            //System.out.println(jsonInString);

        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static User createDummyUser() {

        User user = new User();

        user.setName("mkyong");
        user.setAge(33);

        List<String> msg = new ArrayList<>();
        msg.add("hello jackson 1");
        msg.add("hello jackson 2");
        msg.add("hello jackson 3");

        user.setMessages(msg);

        return user;

    }
}


package org.soproject;

import java.util.List;

import org.codehaus.jackson.map.annotate.JsonFilter;

@JsonFilter("myFilter")
public class User {

    private String name;
    private int age;
    private List<String> messages;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<String> getMessages() {
        return messages;
    }

    public void setMessages(List<String> messages) {
        this.messages = messages;
    }

    // getters and setters

}
import org.codehaus.jackson.jsongGenerationException;
导入org.codehaus.jackson.map.JsonMappingException;
导入org.codehaus.jackson.map.ObjectMapper;
导入org.codehaus.jackson.map.ser.FilterProvider;
导入org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
导入org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;
公共类Jacksone示例{
公共静态void main(字符串[]args){
ObjectMapper mapper=新的ObjectMapper();
User User=createDummyUser();
试一试{
//它的年龄在这里,这是有条件的根据您的字段集
SimpleBeanPropertyFilter过滤器=SimpleBeanPropertyFilter.serializeAllExcept(“年龄”);
FilterProviderFilters=新的SimpleFilterProvider().addFilter(“myFilter”,过滤器);
//将对象转换为JSON字符串
字符串jsonInString=jsonInString=mapper.writer(过滤器).writeValueAsString(用户);
System.out.println(jsonInString);
//将对象转换为JSON字符串并打印
//System.out.println(jsonInString);
}捕获(JsonGenerationException e){
e、 printStackTrace();
}捕获(JsonMappingException e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有静态用户createDummyUser(){
用户=新用户();
user.setName(“mkyong”);
用户设置(33);
List msg=new ArrayList();
msg.add(“hello jackson 1”);
msg.add(“hello jackson 2”);
msg.add(“hello jackson 3”);
user.setMessages(msg);
返回用户;
}
}
包org.soproject;
导入java.util.List;
导入org.codehaus.jackson.map.annotate.JsonFilter;
@JsonFilter(“myFilter”)
公共类用户{
私有字符串名称;
私人互联网;
私人列表消息;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
公共列表getMessages(){
返回消息;
}
公共消息(列出消息){
this.messages=消息;
}
//接球手和接球手
}
忽略您看到的年龄:

{“姓名”:“mkyong”,“信息”:[“你好,杰克逊1”,“你好,杰克逊2”,“你好,杰克逊3”]}

注:杰克逊的资料来源是: