【问题标题】:Rename "type" from JSON moxy output从 JSON moxy 输出重命名“类型”
【发布时间】:2015-06-10 22:51:33
【问题描述】:

我正在为 Moxy 处理对象继承的方式而苦恼。

特别是,我需要重命名 Moxy 在子类型的情况下添加的默认 type 元素,因为它会阻止我在我的对象中拥有自己的 type 字段。

这个问题与Remove "type" from JSON output jersey moxy 有关,但不幸的是,它没有回答我的问题。

我尝试在我的抽象类中包含 @XmlDiscriminatorNode,这似乎对生成的 json 没有任何影响。

我也尝试完全删除默认的 moxy type 元素,但没有任何成功。

【问题讨论】:

标签: java json eclipselink marshalling moxy


【解决方案1】:

MOXy 2.6 中类型属性的处理发生了变化。从 MOXy 2.6 开始,类型属性默认以 xsi 前缀(或您定义的任何前缀)作为前缀。这意味着 MOXy 从 2.6 版本开始不应该有类型属性冲突。

详情请见https://wiki.eclipse.org/EclipseLink/DesignDocs/459464

命名空间前缀需要指定为 JAXBContext 属性:

unmarshaller.setProperty(JAXBContextProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON); 映射命名空间 = new HashMap(); namespaces.put(javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, "xsi"); unmarshaller.setProperty(JAXBContextProperties.NAMESPACE_PREFIX_MAPPER, 命名空间);

【讨论】:

  • 通过添加命名空间前缀映射器,MOXy 开始将命名空间放置在任何地方,这是我们的 Javascript 客户端不接受的。我会看看我能做些什么来消除除 XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI 命名空间之外的命名空间的使用......
  • 顺便问一下,是否支持通过使用@XmlCustomizer 和DescriptorCustomizer 重命名type,这样可以调用ClassDescriptor.getInheritancePolicy().setClassIndicatorFieldName("@moxy-type")?当我尝试这样做时,MOXy 失去了正确解组 JSON 的能力(对我来说听起来像是一个错误)。
  • 删除不必要的命名空间应该可以解决问题。我知道在某些情况下它可能真的很烦人。
  • 我之前没有使用过 setClassIndicatorFieldName。但是,我在 moxy 测试中发现了这一点: NamespaceResolver nsResolver = new NamespaceResolver(); nsResolver.put("xsi", javax.xml.XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); xmlDescriptor.setNamespaceResolver(nsResolver); xmlDescriptor.getInheritancePolicy().setClassIndicatorFieldName("@xsi:type");也许你可以使用 xmlDescriptor.getInheritancePolicy().setClassIndicatorFieldName("@type");没有命名空间。
猜你喜欢
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 2012-07-12
  • 2012-02-15
  • 2020-06-08
  • 1970-01-01
  • 2015-02-08
相关资源
最近更新 更多