Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson自定义序列化以展平对象_Java_Json_Serialization_Jackson_Deserialization - Fatal编程技术网

Java Jackson自定义序列化以展平对象

Java Jackson自定义序列化以展平对象,java,json,serialization,jackson,deserialization,Java,Json,Serialization,Jackson,Deserialization,我有一个java pojo,如下所示: public class FooA { private String s1; private String s2; private int i; private double d1; private double d2; private Timestamp timestamp; private LocalDate date; private List<String> listOfS

我有一个java pojo,如下所示:

public class FooA {
    private String s1;
    private String s2;
    private int i;
    private double d1;
    private double d2;
    private Timestamp timestamp;
    private LocalDate date;
    private List<String> listOfStrings;
    private FooB fooB;

    //Constructors & getters
}

public class FooB {
    private String t;
    private int i1;
    private int i2;

    //Constructors & getters
}
注意FooA是如何变平的。而不是:

"fooB":{  
      "t":"fooBString",
      "i1":100,
      "i2":200
}
在JSON的底部,它被展平以将这些字段提取到父JSON中

我可以这样编写自定义序列化程序:

public class FooASerializer extends StdSerializer<FooA> {
    public FooASerializer() {
        this(null);
    }

    protected FooASerializer(final Class<FooA> t) {
        super(t);
    }

    @Override
    public void serialize(final FooA value,
                          final JsonGenerator gen,
                          final SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("s1", value.getS1());
        gen.writeStringField("s2", value.getS2());
        gen.writeStringField("i", value.getI());
        gen.writeStringField("d1", value.getD1());
        gen.writeStringField("d2", value.getD2());
        //etc etc
        gen.writeStringField("t", value.getFooB.getT());
        gen.writeStringField("i1", value.getFooB.getI1());
        gen.writeStringField("i2", value.getFooB.getI2());
        gen.writeEndObject();
    }
}
公共类FooASerializer扩展了StdSerializer{
公共食品添加剂(){
这个(空);
}
受保护食品添加剂(最终t级){
超级(t);
}
@凌驾
public void serialize(最终FooA值,
最终JSONG发电机,
最终SerializerProvider提供程序)引发IOException{
gen.writeStartObject();
gen.writeStringField(“s1”,value.getS1());
gen.writeStringField(“s2”,value.getS2());
gen.writeStringField(“i”,value.getI());
gen.writeStringField(“d1”,value.getD1());
gen.writeStringField(“d2”,value.getD2());
//等等
gen.writeStringField(“t”,value.getFooB.getT());
gen.writeStringField(“i1”,value.getFooB.getI1());
gen.writeStringField(“i2”,value.getFooB.getI2());
writeEndObject将军();
}
}
但是,如果您在
FooA
上有更多的字段,这可能会变得相当麻烦

那么,有没有一种方法可以告诉Jackson只序列化
FooA
中的所有字段,除了
FooB-FooB
中的字段,它应该在父json中进行自定义序列化以提取字段


我基本上不需要任何嵌套的JSON。

您不需要为此用例编写自定义序列化程序。 只需对
FooB
使用
@JsonUnwrapped
注释即可

例如:

public class FooASerializer extends StdSerializer<FooA> {
    public FooASerializer() {
        this(null);
    }

    protected FooASerializer(final Class<FooA> t) {
        super(t);
    }

    @Override
    public void serialize(final FooA value,
                          final JsonGenerator gen,
                          final SerializerProvider provider) throws IOException {
        gen.writeStartObject();
        gen.writeStringField("s1", value.getS1());
        gen.writeStringField("s2", value.getS2());
        gen.writeStringField("i", value.getI());
        gen.writeStringField("d1", value.getD1());
        gen.writeStringField("d2", value.getD2());
        //etc etc
        gen.writeStringField("t", value.getFooB.getT());
        gen.writeStringField("i1", value.getFooB.getI1());
        gen.writeStringField("i2", value.getFooB.getI2());
        gen.writeEndObject();
    }
}
class FooA {
    private String s1;
    private String s2;

  // other fields 

    @JsonUnwrapped
    private FooB fooB;

//getter setter

}