2012-09-14 81 views
3

我有一些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 
    ; 
} 

所以我的問題是

  1. 有沒有人寫了一個自定義解串器以支持這個功能嗎?或者有另一種方法來解決這個問題。
  2. 如何保留根元素名稱?

下面是一個測試例子

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

FWIW,_handleDuplicateField不是這樣做的 - 它只是一個錯誤處理的事情。另外,您無法有效地使用樹模型來處理此問題--XML數據綁定需要一些解決方法,如果沒有Java類提供的類型信息,則無法應用這些解決方法。 – StaxMan

+0

我想我可能會走錯方向。感謝您爲我澄清這一點:) 這對我來說可能是最好的創建一些POJO的幾個變化,我必須能夠序列化和反序列化,至少直到傑克遜庫在2.1版本中有適當的支持。 – alternative4

回答

2

真正重要的是在這裏你的類 - 只是在展示自己的XML沒有給予足夠的信息來知道是怎麼回事。

我懷疑你會需要Jackson 2.1(一旦它在一兩週內發佈),因爲它最終支持「展開的列表」。在此之前,只有「包裝」列表正常工作。

+0

好的,謝謝你的回答,我會檢查更新後的版本。我只是感到驚訝,沒有在[jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)的概述頁面中提到這一點。 – alternative4

+0

順便說一句,我忘了提及我目前正在使用jackson庫的2.0.6版本(jackson-dataformat-xml的2.0.5版本)。 – alternative4

+0

同意介紹頁面不完整 - 缺少對「展開」數組的支持是一件大事,它可以輕鬆滿足希望完全兼容JAXB的任何人。 – StaxMan

相關問題