6

現在、XStreamを使用してJSONを逆シリアル化していますが、うまく機能しています。ただし、次のようなJSON文字列がある場合

{
    key1: { an_object: { something: 'foobar' } },
    key2: { another_object: { data: 'hi' }
}

特に、ルートノードがないため、解析方法がわかりません。基本的に、逆シリアル化にはDROP_ROOT_NODEの反対が必要です。

4

3 に答える 3

4

簡単な答えは「できません」です。

XStreamは、インスタンス化するクラスを知る必要があり、JSON(またはXML)データからその知識を取得します。クラス名はエイリアス化できますが、省略できません。次の方法で回避できます。

  1. クラス名(またはエイリアス)を含むルートノードでJSON文字列を手動でラップする
  2. あなたのためにそれをするあなた自身のリーダーを書くこと。ただし、この場合でも、明示的にまたは慣例により、クラス名(エイリアス)をそのリーダーに渡す必要があります(たとえば、常に「root」を付加し、XStreamインスタンスでクラスのエイリアスとして構成します)。これが#1よりもクリーンだとは思わない。
于 2009-08-11T22:57:56.297 に答える
3

これは古い質問ですが、午前中のグーグルで解決策を投稿します。答えは、ダミーのルートノード(開始タグと終了タグ)を提供することです。これを実現するための親友の1人はSequenceInputStreamです。

私のコードは次のとおりです。

        reader = new XppDriver().createReader(new SequenceInputStream(
        Collections.enumeration(Arrays.asList(
        new InputStream[] {
                new ByteArrayInputStream("<PlatformAuditEvents>".getBytes()),
                new FileInputStream(file),
                new ByteArrayInputStream("</PlatformAuditEvents>".getBytes())
            }))
    ));
    in = xstream.createObjectInputStream(reader);

ここでは、3つのInputStreamオブジェクトを混合しました。これは、処理されるファイルに必要なタグがないことを提供する1番目と3番目のオブジェクトです。

このソリューションは、このSOの質問に触発されました。これが誰かを助けることを願っています。

于 2013-03-08T17:03:42.563 に答える
1

以下のコードを使用してください。

XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
    public HierarchicalStreamWriter createWriter(Writer writer) {
        return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
    } });
于 2011-02-17T05:50:24.477 に答える