Java Jackson忽略3:d party子类上的属性

Java Jackson忽略3:d party子类上的属性,java,json,jackson,mongo-jackson-mapper,Java,Json,Jackson,Mongo Jackson Mapper,我有一个3d库,它包含在我使用的类中,我想用jackson序列化为json 我想要jackson对象A,但是忽略C类中的字段,而不能更改B类和C类的源代码,这可能吗 class A { B b; } class B { C c; } class C { int field; } 我相信您可以通过使用自定义序列化程序来实现解决方案 您可以通过ObjectMapper添加自定义序列化程序。我在下面创建了一个小单元测试,演示了如何实现它: import org.codeh

我有一个3d库,它包含在我使用的类中,我想用jackson序列化为json

我想要jackson对象A,但是忽略C类中的字段,而不能更改B类和C类的源代码,这可能吗

class A {

   B b;
}

class B {
   C c;

}



class C {
 int field; 
}

我相信您可以通过使用自定义序列化程序来实现解决方案

您可以通过ObjectMapper添加自定义序列化程序。我在下面创建了一个小单元测试,演示了如何实现它:

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.module.SimpleModule;
import org.junit.Test;
import java.io.IOException;

public class JacksonSerializerTest {

    @Test
    public void test() throws Exception {
        C c = new C("initially lowercase string in c");
        B b = new B(c);
        A a = new A(b);

        SimpleModule module = new SimpleModule("MyCustomModule", new Version(1, 0, 0, null));
        module.addSerializer(new CustomSerializerForC());

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(module);

        String pretty = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(a);
        System.out.println(pretty);
    }

    public class A {
        private B b;

        public A(B b) {
            this.b = b;
        }

        public B getB() {
            return b;
        }

        public void setB(B b) {
            this.b = b;
        }
    }

    public class B {
        private C c;

        public B(C c) {
            this.c = c;
        }

        public C getC() {
            return c;
        }

        public void setC(C c) {
            this.c = c;
        }
    }

    public class C {
        private String value;

        public C(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }

    public class CustomSerializerForC extends JsonSerializer<C> {

        @Override
        public Class<C> handledType() {
            return C.class;
        }

        @Override
        public void serialize(C c, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
            String upperCase = c.getValue().toUpperCase();
            jsonGenerator.writeString(upperCase);
        }
    }
}
import org.codehaus.jackson.JsonGenerator;
导入org.codehaus.jackson.JsonProcessingException;
导入org.codehaus.jackson.Version;
导入org.codehaus.jackson.map.JsonSerializer;
导入org.codehaus.jackson.map.ObjectMapper;
导入org.codehaus.jackson.map.SerializerProvider;
导入org.codehaus.jackson.map.module.SimpleModule;
导入org.junit.Test;
导入java.io.IOException;
公共类JacksonSerializerTest{
@试验
public void test()引发异常{
C=新的C(“C中最初为小写字符串”);
B=新的B(c);
A=新的A(b);
SimpleModule=new SimpleModule(“MyCustomModule”,新版本(1,0,0,null));
addSerializer(新的CustomSerializerForC());
ObjectMapper mapper=新的ObjectMapper();
映射器注册表模块(模块);
字符串pretty=mapper.writerWithDefaultPrettyPrinter().writeValueAsString(a);
System.out.println(漂亮);
}
公共A类{
私人B,;
公共服务A(B){
这个.b=b;
}
公共B getB(){
返回b;
}
公屋空置登记册(乙){
这个.b=b;
}
}
公共B级{
私人C C;
公共图书馆B(C){
这个.c=c;
}
公共C getC(){
返回c;
}
国家经济贸易委员会(C){
这个.c=c;
}
}
公共C类{
私有字符串值;
公共C(字符串值){
这个值=值;
}
公共字符串getValue(){
返回值;
}
公共void设置值(字符串值){
这个值=值;
}
}
公共类CustomSerializerForC扩展JsonSerializer{
@凌驾
公共类handledType(){
返回C类;
}
@凌驾
public void serialize(C C、JsonGenerator、JsonGenerator、SerializerProvider SerializerProvider)引发IOException、JsonProcessingException{
字符串大写=c.getValue().toUpperCase();
jsonggenerator.writeString(大写);
}
}
}

另一种采用较新Jackson的解决方案可能是mix-ins或JacksonAnnotationIntrospector,如