JSONに変換する必要があるXML形式の単純なデータがいくつかあり、JSONを同じXML文字列に変換することもできます。しかし、既存のjackson(バージョン2.0.6)ライブラリを使用してこれを行うことに問題があります。
同様の構造を持つXMLデータの例を次に示します
<channels>
<channel>A</channel>
<channel>B</channel>
<channel>C</channel>
</channels>
これを元のXMLに変換できるようにするには、JSONを次のように表示します。
{
"channels": {
"channel": [
"A",
"B",
"C"
]
}
}
しかし、ジャクソンは私に
{"channel":"C"}
ルート要素名は保持されず、代わりにチャネルの配列を作成し、最後の要素が前の要素を上書きします。
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());
}
}