2009-08-11 5 views
6

現在、XStreamを使用してJSONをデシリアライズしています。私は、次のXStreamはルートノードのないJSONを解析します

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

のようなJSON文字列を持っている場合しかし、最も注目すべきことは、ルートノードを持っていない、私はそれを解析するかどうかはわかりません。基本的には、逆シリアル化のためにDROP_ROOT_NODEの反対が必要です。

+0

会話がこれに関して行われているように見えますが、意味があります。それはXMLパーサーに基づいており、XMLにはルートノードが含まれている必要があります。答えは "それはできません"のように見えます。 http://www.nabble.com/Serializing-JSON-with-no-root--td21732630.html –

答えて

4

短い答えは「できません」です。

XStreamはインスタンス化するクラスを知る必要があり、JSON(またはXML)データからその知識を取得します。クラス名にエイリアスを付けることはできますが、省略することはできません。あなたのためにそれを行うだろうあなた自身のリーダーを書く

  • 自分のクラス名(またはエイリアス)を含むルートノードを使用してJSON文字列をラップ手動

    1. :あなたは、によって回避することができます。しかし、この場合は、明示的にまたは慣習に従ってクラス名(エイリアス)を渡す必要があります(たとえば、常に「root」を追加してからXStreamインスタンスでクラスのエイリアスとして設定するなど)これは#1よりもきれいだと思います。
  • +0

    オプション2を実行する方法の例を教えてください。 – portfoliobuilder

    2

    以下のコードを使用します。私は、これは古い質問ですけど、私は全体の朝のグーグル後の私の解決策を投稿します

    XStream xstream = new XStream(new JsonHierarchicalStreamDriver() { 
        public HierarchicalStreamWriter createWriter(Writer writer) { 
         return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE); 
        } }); 
    
    +0

    ルートノードのないJSONの読み込みはどうですか?それを提供できるサンプルコードがありますか? – raffian

    3

    を。答えは、ダミールートノード(開始タグと終了タグ)を提供することです。

    私のコードは次のようである:これを実現するためには、あなたの最高の友人の一人はたSequenceInputStreamである私はそれらを提供する第一及び第三のものであること、3つのInputStreamオブジェクトを混入してきました。ここ

     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); 
    

    必要処理されたファイルにタグがありません。

    この解決方法は、このSO Questionからインスピレーションを受けました。これが誰かを助けることを望みます。