给定以下类(class):
@XmlSeeAlso({A.class, B.class})
@XmlDiscriminatorNode("@type")
public abstract class Base implements Serializable {
}
让A
(和类似的 B
)是:
@XmlDiscriminatorValue("A")
public class A extends Base {
private String foo;
// constructor, getter, setter
}
包装List<Base>
包含这两种类型的对象将生成以下示例 JSON:
{
"list": [
{
"@type": "A",
"bar": 123
},
{
"@type": "A",
"bar": 789
},
{
"@type": "B",
"foo": "sddadad"
},
{
"@type": "B",
"foo": "ttf4eg4gf sd"
},
{
"@type": "A",
"bar": 465
}
]
}
现在到我的问题出现的部分:当 @type
属性从“第一个”位置移开,解码失败:
{
"bar" : 123,
"@type" : "A"
}
Exception Description: Missing class indicator field from database row [UnmarshalRecordImpl()].
这是预期的行为吗?我是否必须确保 @type
声明始终是“第一”?
我正在使用 EclipseLink 2.5.1.v20130619-ffd088c 每晚构建。
最佳答案
当在解码器上指定 UnmarshallerProperties.JSON_ATTRIBUTE_PREFIX
时,目前 EclipseLink JAXB (MOXy)要求带有属性前缀的键出现在不带属性前缀的键之前。我已提出以下增强请求(请参阅下面的链接),您可以使用它来跟踪我们在此问题上的进展。
解决方法
仅当设置 UnmarshallerProperties.JSON_ATTRIBUTE_PREFIX
属性时,才会出现此问题。如果未设置,MOXy 可以毫无问题地解码以下内容:
{
"bar" : 123,
"type" : "A"
}
关于json - JSON 对象中 @type 的位置导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17271109/