【问题标题】:Deserializing Parent Object based on id根据 id 反序列化父对象
【发布时间】:2016-02-05 15:54:07
【问题描述】:

我正在尝试反序列化包含在“模块”对象中的“onclick”事件,如以下 JSON 所示:

{
    "parent": {
        "id": 0,
        "children": [{
            "child": {
                "id": 1,
                "description": "A",
                "parent": 0,
                "events": [{
                    "onclick": {
                        "source": 1
                    }
                }]
            }
        }]
    }
}

类结构很简单:

View (Interface)
 +- AbstractView
    +- Parent
        +- Child

Event (Interface)
 +- AbstractEvent
    +- OnClick

抽象事件:

public abstract class AbstractEvent implements Event {

    private View source;

    protected AbstractEvent() {}

    protected AbstractEvent(View source) {
        this.source = source;
    }

    @Override
    public View getSource() {
        return source;
    }

    @Override
    public void setSource(View source) {
        this.source = source;
    }

}

我使用 Mixins 作为模型在几个不同的项目之间使用。

视图混合:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "type")
@JsonSubTypes({
    @Type(value = Parent.class, name = "parent"),
    @Type(value = Child.class, name = "child")
})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public abstract class ViewMixIn {

}

EventMixIn:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "class")
@JsonSubTypes({
    @Type(value = OnClick.class, name = "onclick")
})
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "source")
public abstract class EventMixIn {

}

简化模块:

@Override
public void setupModule(SetupContext context) {
    super.setupModule(context);

    context.setMixInAnnotations(AbstractView.class, ViewMixIn.class);
    context.setMixInAnnotations(AbstractEvent.class, EventMixIn.class);

}

ObjectMapper 配置:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new SimplifiedModule())
    .setSerializationInclusion(NON_NULL)
    .setSerializationInclusion(NON_EMPTY)
    .enableDefaultTyping()
    .enableDefaultTyping(NON_FINAL, As.WRAPPER_OBJECT)
    .setVisibilityChecker(
        mapper.getSerializationConfig().getDefaultVisibilityChecker()
            .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
            .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

如图所示,模型序列化正确,但反序列化时出现如下错误:

警告 11:46:04:949 br.com.pdcore.appmaker.middleware.simplified.SimplifiedModelTest - 无法反序列化父级。 com.fasterxml.jackson.databind.JsonMappingException:意外的令牌 (VALUE_NUMBER_INT),预期的 START_OBJECT:需要 JSON 对象来包含类 br.com.pdcore.appmaker.middleware.simplified.model.view.View 的 As.WRAPPER_OBJECT 类型信息 在 [来源:{“父”:{“id”:0,“children”:{“java.util.ArrayList”:[{“child”:{“id”:1,“description”:“A”, "parent":0,"events":{"java.util.ArrayList":[{"onclick":{"source":1}}]}}},{"child":{"id":2, "description":"B","parent":0,"events":{"java.util.ArrayList":[{"onclick":{"source":2}}]}}},{"child" :{"id":3,"description":"C","parent":0,"events":{"java.util.ArrayList":[{"onclick":{"source":3}}] }}},{"child":{"id":4,"description":"D","parent":0,"events":{"java.util.ArrayList":[{"onclick":{ "source":4}}]}}},{"child":{"id":5,"description":"E","parent":0,"events":{"java.util.ArrayList" :[{"onclick":{"source":5}}]}}}]}}};行:1,列:145](通过引用链:br.com.pdcore.appmaker.middleware.simplified.model.view.Parent["children"]->java.util.ArrayList[0]->br.com .pdcore.appmaker.middleware.simplified.model.view.Child["events"]->java.util.ArrayList[0]->br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick["来源"])

好像不理解“源” id 是指包装 onclick 节点的子对象。

如果我从以下位置更改 MixIn 定义:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "name")

到:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "type")

我仍然收到类似的错误:

警告 12:04:35:126 br.com.pdcore.appmaker.middleware.simplified.SimplifiedModelTest - 无法反序列化父级。 com.fasterxml.jackson.databind.JsonMappingException:意外令牌 (VALUE_NUMBER_INT),预期 FIELD_NAME:缺少包含类型 ID 的属性“@class”(对于类 br.com.pdcore.appmaker.middleware.simplified.model.view。看法) 在 [来源:{"type":"br.com.pdcore.appmaker.middleware.simplified.model.view.Parent","id":0,"children":["java.util.ArrayList",[{ "type":"br.com.pdcore.appmaker.middleware.simplified.model.view.Child","id":1,"description":"A","parent":0,"events":[" java.util.ArrayList",[{"type":"br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick","source":1}]]},{"type":"br .com.pdcore.appmaker.middleware.simplified.model.view.Child","id":2,"description":"B","parent":0,"events":["java.util.ArrayList" ,[{"type":"br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick","source":2}]]},{"type":"br.com.pdcore.appmaker .middleware.simplified.model.view.Child","id":3,"description":"C","parent":0,"events":["java.util.ArrayList",[{"type" :"br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick","source":3}]]},{"type":"br.com.pdcore.appmaker.middleware.simplified.model .view.Child","id":4,"description":"D","parent":0,"events":["java.util.ArrayList",[{"type":"br.com. pdcore.appmaker.middlew are.simplified.model.event.OnClick","source":4}]]},{"type":"br.com.pdcore.appmaker.middleware.simplified.model.view.Child","id": 5,"description":"E","parent":0,"events":["java.util.ArrayList",[{"type":"br.com.pdcore.appmaker.middleware.simplified.model. event.OnClick","source":5}]]}]]};行:1,列:331](通过引用链:br.com.pdcore.appmaker.middleware.simplified.model.view.Parent["children"]->java.util.ArrayList[0]->br.com .pdcore.appmaker.middleware.simplified.model.view.Child["events"]->java.util.ArrayList[0]->br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick["来源"])

【问题讨论】:

    标签: java json jackson mixins


    【解决方案1】:

    在仔细阅读 JsonIdentityInfo 的 javadoc 之后,发现了以下问题:

    在 POJO 的情况下,对象 id 必须作为属性序列化;对象标识目前不支持 JSON 数组类型(Java 数组或列表)或 Java Map 类型。

    所以基本上我需要生成一个自定义的反序列化器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 2019-08-27
      • 1970-01-01
      相关资源
      最近更新 更多