当前位置: 首页 > 知识库问答 >
问题:

jackson嵌套反序列化器调用另一个

程城
2023-03-14
class A {
    private String z;
    private String y;
    private List<B> bs;
}

class B {
    private String x;
}
public class ASerializer extends JsonSerializer<A> {

@Override
public void serialize(A value, JsonGenerator gen,
        SerializerProvider serializers) throws IOException,
        JsonProcessingException {

    gen.writeStartObject();
    gen.writeStringField("z", value.getZ());
    gen.writeStringField("y", value.getY());

    gen.writeFieldName("bs");
    gen.writeStartArray(value.getBs().size());
    for (B b : value.getBs())
        gen.writeObject(b);
    gen.writeEndArray();

    gen.writeEndObject();  
}

public class ASerializer extends JsonSerializer<A>
{
@Override
public void serialize(B value, JsonGenerator gen,
        SerializerProvider serializers) throws IOException,
        JsonProcessingException {

    gen.writeStartObject();
    gen.writeStringField("x", value.getX());

    gen.writeEndObject();  
}
@Override
public A deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    A a = null;

    JsonNode node = p.getCodec().readTree(p);

    String z = node.get("z").asText();
    String y = node.get("y").asText();
    List<B> bs = node.get("bs") //.asListofB
    //...

注意:AB是第三方类。所以我不能注释这些。

共有1个答案

卓麒
2023-03-14

即使不能直接注释这些类,也可以编写“mixin”注释类。这些类的存在只是为了保存注释,然后就像它们在其他类上一样应用注释。例如:

public abstract class AMixin {
    @JsonProperty public abstract String getZ();
    @JsonProperty public abstract String getY();
    @JsonProperty public abstract List<B> getBs();
}

配置mixin:

mapper.addMixInAnnotations(A.class, AMixin.class);

如果您沿着基于JsonNode表示形式(btw extendStdNodeBasedDeserializer)编写反序列化器的路线前进,那么您会遇到这样一个问题,即反序列化器通常在流上工作,而不是在树节点上工作。现在,任何树节点都可以作为流进行遍历:因此,可以接受node.get(“BS”),调用traverse(),从而获得一个JSONParser,并将其传递给反序列化器。当然,如果反序列化器最终将流转换回树节点,这有点浪费...

 类似资料:
  • 我知道我可以创建一个单独的Report类,然后使用@JSONProperty将其嵌入到ReportResponse中。有没有一种方法可以避免这种情况,并用一个注释标记ReportResponse类,将它映射到JSON中的“Report”元素?

  • 我正在创建一个具有嵌套列表的API。Jackson似乎是一个创建对象的好工具,但我不太清楚如何嵌套列表,我想知道这是否可能。 我的对象看起来像这样。 我希望有一种方法可以将其映射到json,看起来像: 我们希望能够做到这一点,以便我们可以将属性添加到列表中。

  • 我有以下xml 我需要将其反序列化为以下POJO: 这里的问题是被包装在元素中

  • 我正在尝试使用Jakson反序列化一个嵌套的多态类型。也就是说,我的顶级类型引用了另一个多态类型,该类型最终由不抽象的类扩展。这不起作用,它会抛出一个异常。 下面是我尝试做的一个简化的例子。 我得到了关于抽象类型的标准异常。 让我解释一下我的用例。我有一个描述数据工作流的Json文档。我在“Level One”有一个抽象类型,描述对单个值的操作。我派生了一堆不是抽象的类,它们实现了公共操作(我用@

  • 问题内容: 我有一个Vendor对象,可以从一个单独的“ vendor” json序列中反序列化,但是我想将此序列反序列化为一个,我只是想不出如何让Jackson合作。有小费吗? 问题答案: 您的数据存在问题,因为您的数组中有内部 包装 对象。想必你的对象被设计成手柄,,,但每次的多个对象也都包裹在一个对象与单一属性。 我假设您正在使用Jackson 数据绑定 模型。 如果是这样,那么有两件事要考

  • 但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?