gpt4 book ai didi

java - Jackson 多态反序列化(类依赖于 JSON 键)

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:38 24 4
gpt4 key购买 nike

长话短说

基本上,我的问题是我有一个包装器对象列表

{"stuff": [
{"foobar" : {someObjectOfTypeA}},
{"barfoo" : {someObjectOfTypeB}},
{"foobar" : {someObjectOfTypeA}}
]}

someObjectOfTypeX 的类型取决于键“foobar”或“barfoo”的值。我怎样才能反序列化这个? (目前)序列化不是问题。


长版

我对 jackson 的了解还不够,无法解决以下问题。我试过了,但还是卡住了。

我要解析的 json 结构如下所示:

{
"id": "foobar",
"responses": [
{
"responseType1": {
"code": 0,
"foo": "bar"
}
},
{
"responseType2": {
"code": 1,
"bar": {"foo": ...}
}
},
{
"responseType1": {
"code": 1,
"foo": "foobar"
}
}
]
}

我尝试使用 jackson 的完整数据绑定(bind)对其进行反序列化。我的 pojos 是:

// pseudocode

// the outermost object
@JsonCreator
ServiceResponse(
@JsonProperty("id") String id,
@JsonProperty("responses") ArrayList<ResponseWrapper> responses)

// every response has a wrapper. the wrapper is an object with just one key and one value. the value is an object of a certain class (ResponseTypeX extends AResponse), and the exact ResponseType is identified by the key (the key isn't the class name though).
@JsonCreator
ResponseWrapper(AResponse keyDependsOnTypeOfAResponse ???)

// base class for all responseTypeX classes
// all subclasses of AResponse have a code and a complex payload object
@JsonCreator
AResponse (
@JsonProperty("code") int code)

// one response type
// here, the payload is just a string, in reality it's a deep structure, so i dont want to parse this manually
@JsonCreator
ResponseType1 extends AResponse (
@JsonProperty("code") int code,
@JsonProperty("foo") String foo)

// one response type
@JsonCreator
ResponseType2 extends AResponse (
@JsonProperty("code") int code,
@JsonProperty("bar") SomeOtherObject foo)

如您所见,responses 是一个包装器对象数组;包装器对象的“有效负载”类由键标识(但键不是与类名的 1:1 匹配)。我的 ResponseTypeX 是有限的,大约有 20 个,所以如果我必须进行手动键:值类型识别,我很高兴。

但是是否有可能为 WrapperResponse 对象编写一个手动反序列化器并继续反序列化其具有完整数据绑定(bind)的子对象?如果是,怎么办?


我试图让 Wrapper 接受所有可能的 ResponseTypes 作为属性,希望它只会使“未设置”的那些无效,例如

@JsonCreator
ResponseWrapper(
@JsonProperty("responseKey1") ResponseType1 response1,
@JsonProperty("responseKey2") ResponseType2 response2,
@JsonProperty("responseKey3") ResponseType3 response3,
...)

但这失败了,可能是因为所有 ResponseType 都是 AResponse 的子类,因此 jackson 感到困惑。

最佳答案

一些自定义的反序列化处理是必要的。我建议在解决方案中包括 foobar/barfoo-to-type 条目的简单注册表(映射),很像 my old blog post from May 25, 2011, "Deserialize JSON with Jackson into Polymorphic Types - A Complete Example" 中的第六个示例。 .

关于java - Jackson 多态反序列化(类依赖于 JSON 键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13715753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com