@type在JSON对象中的位置会导致错误

时间:2013-06-24 08:32:15

标签: json jaxb moxy

鉴于以下课程:

@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。

1 个答案:

答案 0 :(得分:2)

当在unmarshaller上指定UnmarshallerProperties.JSON_ATTRIBUTE_PREFIX时,当前EclipseLink JAXB (MOXy)要求具有属性前缀的键在没有键之前发生。我已打开以下强化请求(请参阅下面的链接),您可以使用该请求跟踪我们在此问题上的进展。

解决方法

仅在设置UnmarshallerProperties.JSON_ATTRIBUTE_PREFIX属性时才会出现此问题。如果没有设置,MOXy可以解决以下问题而不会出现任何问题:

{
    "bar" : 123,
    "type" : "A"
}