当前位置: 首页 > 知识库问答 >
问题:

奇怪的XmlMixed XMLJAXBJSON封送/解封与MOXy

太叔马鲁
2023-03-14

我有以下类型,在架构中定义为:

<xsd:complexType name="any_t" mixed="true">
  <xsd:sequence>
    <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"></xsd:any>
  </xsd:sequence>
</xsd:complexType>

生成的JAXB类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "any_t", propOrder = {
    "content"
})
public class AnyT implements Serializable
{
    private final static long serialVersionUID = 1L;
    @XmlMixed
    @XmlAnyElement(lax = true)
    protected List<Object> content;
    public List<Object> getContent() {
        if (content == null) {
            content = new ArrayList<Object>();
        }
        return this.content;
    }
}

使用此类型的一些JAXB类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "addInfo"
})
@XmlRootElement(name = "FORM_OF_COOWNERS")
public class FormOfCoowners
    implements Serializable
{
    private final static long serialVersionUID = 1L;
    @XmlElement(name = "add_info")
    protected AnyT addInfo;
    public AnyT getAddInfo() { return addInfo; }
    public void setAddInfo(AnyT value) { this.addInfo = value; }
}

当我将此XML解组为JAXB对象时:

<FORM_OF_COOWNERS>
   <add_info>
      <info_analytics>
         <issuer_subdiv>
            <id><id>1940001</id></id>
         </issuer_subdiv>
         <fl_worker>Yes</fl_worker>
      </info_analytics>
   </add_info>
</FORM_OF_COOWNERS>
{"FORM_OF_COOWNERS":{"add_info":{"info_analytics":[{"issuer_subdiv":{"id":{"id":"1940001"}},"fl_worker":"Yes"}]}}}

这份名单从何而来?info_analytics映射到没有任何集合/数组的类型。

如果我得到这个JSON,umarshall将其转换为JAXB对象,marshall转换为XML,它将生成:

<info_analytics fl_worker="Yes">
  <issuer_subdiv>
    <id id="1940001">
       <id>1940001</id>
    </id>
  </issuer_subdiv>
  <fl_worker>Yes</fl_worker>
</info_analytics>

为什么元素作为属性重复?

def unmarshallToJaxbTyped[A : ClassTag](json: String): Throwable \/ A =
  \/.fromTryCatchNonFatal {
    val cls = classTag[A].runtimeClass
    val jc = JAXBContext.newInstance(cls)
    val unmarshaller = jc.createUnmarshaller()
    unmarshaller.setProperty("eclipselink.media-type", "application/json")
    unmarshaller.unmarshal(new StreamSource(new StringReader(json)), cls)
      .getValue.asInstanceOf[A]
  }

def marshallJaxbToJson(obj: Any): Throwable \/ String =
  \/.fromTryCatchNonFatal {
    val jc = JAXBContext.newInstance(obj.getClass)
    val marshaller = jc.createMarshaller()
    marshaller.setProperty("eclipselink.media-type", "application/json")
    val writer = new StringWriter()
    marshaller.marshal(obj, writer)
    writer.getBuffer.toString
  }

XML:

protected static synchronized JAXBContext getContext() {
  if (jaxbContext == null)
    try {
      jaxbContext = JAXBContext.newInstance("org.example.models");
    } catch (JAXBException ex) {
      throw new RuntimeException(ex);
    }
  return jaxbContext;
}

public static void saveMessage(Object msg, OutputStream os) throws JAXBException {
  Marshaller marshaller = getContext().createMarshaller();
  marshaller.marshal(msg, os);
}

public static Object loadMessage(InputStream is) throws JAXBException {
  Unmarshaller unmarshaller = getContext().createUnmarshaller();
  return unmarshaller.unmarshal(is);
}

共有1个答案

周威
2023-03-14

我不知道这种奇怪的往返:xml->java->json->java->XML需要多少次。我想您应该理解,XML比JSON支持更多的特性,这就是为什么不总是可以进行1对1映射的原因。

如果这对您来说是一个真正的问题,并且不仅仅是理论研究,请针对MOXY发射一个bug:https://bugs.eclipse.org/bugs/enter_bug.cgi?product=eclipselink

 类似资料:
  • 我正在尝试使用JAXB进行封送处理。 我的输出是这样的: ...但我需要这样的输出: 如果取消对代码的注释,则会得到。没有它,我可以编译,但我不能得到所需的精确输出。 我的豆子长这样: 适配器类

  • 问题内容: 我通常对JOINS十分熟悉,但这是新的。 假设三个表(两个表的典型情况和第三个链接器表): (出于简化目的,我无法复制实际的结构,这不是我的代码。) 通常,要获得“谁在什么时候买了什么”的表格,我可以这样做: 但是我已经看到了这个: 这是什么?只是另一种语法,还是一种性能技巧? (它在SQLServer,FYI上,但是大概可以应用于其他…) 问题答案: 括号不会改变语义。子句的位置控制

  • null 杰克逊在默认情况下有能力做到这一点。

  • 我有一个遗留web服务项目,它接收两个不同的XML模式,但属性名称相同(包括根元素)。我正在使用Spring、OXM和JAXB2进行编组/解组。 我已经用另一个问题解决了前面的一个问题,所以我使用SAX解析器来确定使用哪一个解组器。解析XML时,我检查一个值,然后就可以使用反编组器或其他反编组器。 我如何将其转换为更Spring(OXM)的方法呢?

  • 问题内容: 当我尝试将[] byte编组为JSON格式时,我只有一个奇怪的字符串。 请看下面的代码。 我有两个疑问: 如何将[] bytes封送至JSON? 为什么[] byte成为此字符串? 输出为: 戈朗游乐场:https : //play.golang.org/p/wanppBGzNR 问题答案: 根据文档:https : //golang.org/pkg/encoding/json/#Ma