[英]JAXB - can class containment be flattened when marshalling to XML?
說,我有兩個班:
@XmlRootElement
class A {
@XmlElement
String propertyOfA;
@XmlElement
B b;
}
class B {
@XmlElement
String propertyOfB;
}
JAXB返回以相應方式格式化的XML:
<a>
<propertyOfA>valueA</propertyOfA>
<b>
<propertyOfB>valueB</propertyOfB>
</b>
</a>
我的問題是如何在XML中展平層次結構? 所以我有:
<a>
<propertyOfA>valueA</propertyOfA>
<propertyOfB>valueB</propertyOfB>
</a>
這可以用注釋完成嗎?
目前我正在考慮為A創建一種包裝類,它將以我希望在XML中看到它們的方式構建字段。 有沒有更好的辦法?
對我來說已經有一段時間了,但是讓我給它一個裂縫:
@XmlRootElement
class A {
@XmlElement
String propertyOfA;
@XmlElement(name="propertyOfB")
B b;
}
@XmlType(name="")
class B {
@XmlValue
String propertyOfB;
}
編輯:免責聲明 - 我沒有編譯或試過這個。 但我相信你是這樣做的。
注意:我是EclipseLink JAXB(MOXy)的負責人,也是JAXB 2(JSR-222)專家組的成員。
您可以使用MOXy的@XmlPath
擴展來映射此用例:
import java.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement
class A {
@XmlElement
String propertyOfA;
@XmlPath(".")
B b;
}
欲獲得更多信息
另一種方法(使用標准JAXB)將使用@XmlJavaTypeAdapter
。 這樣,您可以調整對象層次結構,其缺點是必須編寫將對象層次結構轉換為適應的新類的代碼。 在你的例子中,它不會起作用,因為你必須適應作為你的根的A類。 但是,如果層次結構更深,並且您需要使適應性比根低一級,則不會出現問題。 一個可能有用的建議是在適應的實體中編寫代碼,使其成為對象層次結構的委托,而不是適配器,后者將非常薄。
看一下這個問題和建議的解決方案: Spring RESTful client:root標簽異常
非常有助於解決這類問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.