Java 如何在序列化/反序列化JSON时删除实例类型?

Java 如何在序列化/反序列化JSON时删除实例类型?,java,json,serialization,deserialization,fasterxml,Java,Json,Serialization,Deserialization,Fasterxml,我使用fasterxml对JSON进行序列化/反序列化 public class A { String field; B b; } public class B { int n; } 我想得到这样格式的JSON { "field": "abc", "n": 123 } public class ADeserializer extends JsonDeserializer<A> { @Override public A deser

我使用
fasterxml
对JSON进行序列化/反序列化

public class A {
    String field;
    B b;
}

public class B {
    int n;
}
我想得到这样格式的JSON

{
  "field": "abc",
  "n": 123
}
public class ADeserializer extends JsonDeserializer<A> {

    @Override
    public A deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
        ObjectCodec codec = p.getCodec();
        JsonNode node = codec.readTree(p);

        String field = node.get("field").asText();
        int n = node.get("n").asInt();

        A a = new A();
        B b = new B();

        b.setN(n);

        a.setField(field);
        a.setB(b);

        return a;
    }

}

有可能吗?

在Java中无法做到这一点。

您可以使用Jackson注释来提供特定的反序列化程序

@JsonDeserialize(using = ADeserializer.class)
public class A {

    private String field;
    private B b;

    // ...
}
类型的反序列化程序应该如下所示

{
  "field": "abc",
  "n": 123
}
public class ADeserializer extends JsonDeserializer<A> {

    @Override
    public A deserialize(JsonParser p, DeserializationContext ctx) throws IOException {
        ObjectCodec codec = p.getCodec();
        JsonNode node = codec.readTree(p);

        String field = node.get("field").asText();
        int n = node.get("n").asInt();

        A a = new A();
        B b = new B();

        b.setN(n);

        a.setField(field);
        a.setB(b);

        return a;
    }

}
公共类ADeserializer扩展JsonDeserializer{
@凌驾
公共反序列化(JsonParser p,反序列化上下文ctx)引发IOException{
ObjectCodec codec=p.getCodec();
JsonNode=codec.readTree(p);
String field=node.get(“field”).asText();
int n=node.get(“n”).asInt();
A=新的A();
B=新的B();
b、 setN(n);
a、 设置字段(字段);
a、 挫折(b);
返回a;
}
}

对于序列化,可以使用自定义序列化程序。就这样。

您只需使用
@JsonUnwrapped
。不需要自定义序列化程序:

public class A {
    public String field;
    @JsonUnwrapped
    public B b;
}

public class B {
    public int n;
}
注意字段的可访问性,否则它将不起作用

正如亚历克斯在书中所展示的,这是可能的。