6

JSONに変換する必要があるXML形式の単純なデータがいくつかあり、JSONを同じXM​​L文字列に変換することもできます。しかし、既存の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
    ;
}

だから私の質問は

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

1 に答える 1

2

ここで本当に重要なのはクラスです。XML自体を表示するだけでは、何が起こっているのかを知るのに十分な情報は得られません。

最終的に「ラップされていないリスト」を正しくサポートするため、Jackson 2.1が必要になると思います(1〜2週間でリリースされたら)。これ以前は、「ラップされた」リストのみが正しく機能します。

于 2012-09-14T21:39:08.037 に答える