2015-04-13 3 views
0

У меня есть следующий тип, определенный в схеме как: 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: сортировочная/демаршаллизации в/из:

JSON
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); 
} 
+0

Вы можете добавить более подробную информацию? (например, маршал и немаршальный код, объект создания и т. д.) – Xstian

+0

@Xstian updated – wedens

ответ

0

Я не знаю, как Ofter такие странные в обе стороны: XML -> Java -> JSON -> Java -> XML. Я думаю, вы понимаете, что XML поддерживает гораздо больше функций, чем JSON, и поэтому не всегда возможно отображать от 1 до 1.

Если это реальная проблема для вас, а не только теоретические исследования, пожалуйста, стрелять ошибку против Moxy: https://bugs.eclipse.org/bugs/enter_bug.cgi?product=EclipseLink

+0

Это чисто практическое исследование. В качестве обходного пути я в конечном итоге написал еще более строго типизированный класс и адаптер из этого класса в/из AnyT – wedens

Смежные вопросы