У меня есть следующий тип, определенный в схеме как: Weird XmlMixed XML <-> JAXB <-> JSON сортировочных/демаршаллизации с Moxy
<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; }
}
Когда я unm arshall этот 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>
и Маршаллу этот объект в JSON, я получаю:
{"FORM_OF_COOWNERS":{"add_info":{"info_analytics":[{"issuer_subdiv":{"id":{"id":"1940001"}},"fl_worker":"Yes"}]}}}
где же этот список пришел? info_analytics сопоставляет тип без каких-либо коллекций/массивов.
Если я получаю это JSON, umarshall его объекта JAXB и Маршаллу в XML, он производит:
<info_analytics fl_worker="Yes">
<issuer_subdiv>
<id id="1940001">
<id>1940001</id>
</id>
</issuer_subdiv>
<fl_worker>Yes</fl_worker>
</info_analytics>
почему элементы дублируются в качестве атрибутов?
UPDATE: сортировочная/демаршаллизации в/из:
JSONdef 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);
}
Вы можете добавить более подробную информацию? (например, маршал и немаршальный код, объект создания и т. д.) – Xstian
@Xstian updated – wedens