我有一些XML格式的簡單數據,我需要將其轉換爲JSON,並且能夠將JSON轉換回相同的XML字符串。但我在使用現有的傑克遜(2.0.6版)庫時遇到問題。使用jackson將具有重複元素的XML轉換爲JSON
這裏的XML數據的結構相似的例子
<channels>
<channel>A</channel>
<channel>B</channel>
<channel>C</channel>
</channels>
爲了能夠將此轉換回原來的XML,我想的JSON看起來像這樣
{
"channels": {
"channel": [
"A",
"B",
"C"
]
}
}
然而傑克遜給我
{"channel":"C"}
根元素名稱不會保留,而是og creatin g通道陣列,最後一個覆蓋前一個通道。
查看com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer的源代碼,我發現該庫不支持這一點,但允許重寫和更改行爲。
/**
* Method called when there is a duplicate value for a field.
* By default we don't care, and the last value is used.
* Can be overridden to provide alternate handling, such as throwing
* an exception, or choosing different strategy for combining values
* or choosing which one to keep.
*
* @param fieldName Name of the field for which duplicate value was found
* @param objectNode Object node that contains values
* @param oldValue Value that existed for the object node before newValue
* was added
* @param newValue Newly added value just added to the object node
*/
protected void _handleDuplicateField(String fieldName, ObjectNode objectNode,
JsonNode oldValue, JsonNode newValue)
throws JsonProcessingException
{
// By default, we don't do anything
;
}
所以我的問題是
- 有沒有人寫了一個自定義解串器以支持這個功能嗎?或者有另一種方法來解決這個問題。
- 如何保留根元素名稱?
下面是一個測試例子
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
public class Test {
public static void main(String[] args) throws Exception {
String xml="<channels><channel>A</channel><channel>B</channel><channel>C</channel></channels>";
XmlMapper xmlMapper = new XmlMapper();
JsonNode node=xmlMapper.readValue(xml,JsonNode.class);
System.out.println(node.toString());
}
}
FWIW,_handleDuplicateField不是這樣做的 - 它只是一個錯誤處理的事情。另外,您無法有效地使用樹模型來處理此問題--XML數據綁定需要一些解決方法,如果沒有Java類提供的類型信息,則無法應用這些解決方法。 – StaxMan
我想我可能會走錯方向。感謝您爲我澄清這一點:) 這對我來說可能是最好的創建一些POJO的幾個變化,我必須能夠序列化和反序列化,至少直到傑克遜庫在2.1版本中有適當的支持。 – alternative4