2013-02-21 5 views
10

キーや値のいずれも引用されていないJSON文字列があり、正しくフォーマットされたJSONに変換したいと思います。引用符で囲まれていないJSON文字列を解析する方法

{basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}} 

これを処理できるJavaライブラリがありますか?私はJacksonを試しましたが、動作しません。

に関して、 月

答えて

4

あなたが引用符で囲まれていないフィールド名を許可するようにジャクソンとJsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMESを使用することができます:あなたは、パーサーかを所有して書くことにまわりましたが、私がやった場合

JsonFactory factory = new JsonFactory(); 
factory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
JsonParser jp = factory.createJsonParser(new FileInputStream("content.json")); 
+2

引用符で囲まれていない値や引用符で囲まれていない数字キー(例: "0:myValue")には役に立ちません – Jan

+1

"ライセンス"の場合: "1、2" 「どのように解釈を選択することをお勧めしますか?あなた自身のデシリアライザを書く必要があると思います。 Jacksonの 'ObjectMapper'と' Module'機能はあなたを助けるかもしれません。 – ipavlic

+0

私の場合、値として '、'のない文字列しか持たないことを知っています。しかし、はい、私は自分のパーサーを書く必要があるように見えます。 – Jan

0

わかりません。ここで

https://github.com/ischumacher/rsjp

あなたの例JSONでの使用例である:ここで

String str = "{basic:{0:{index:0, license:t, nameSID:n, image:\"img_left\", descriptionSID:t, category:r}}"; 
Map<String, Object> jso = Json.parseJSON(str); 
System.out.println(jso); 
System.out.println(Json.get(jso, "basic", "0", "image")); 

が出力されます:

{ 
    basic: 
    { 
     0: 
     { 
     index: 0, 
     license: t, 
     nameSID: n, 
     image: img_left, 
     descriptionSID: t, 
     category: r 
     } 
    } 
} 

img_left 
0

私は1つに対処するためにジャクソンのカスタマイズについては行くかもしれない方法に見えました引用符で囲まれていないフィールド値(対フィールド名)。代わりにハックを書き終わったにもかかわらず、私は他の人のためにパンくずりの道を掲示しています。私のコードはJackson 2.7.2でspelunkingされました。

ジャクソンコアはJsonParserインタフェースの2つの具象実装が付属して:

  • ReaderBasedJsonParser、文字ストリームのためのパーサ(独立符号化 )
  • UTF8StreamJsonParser、UTF-8バイトのために最適化されたパーサー
  • ストリーム

これらの2つのクラスのコードは非常に重複しているため、必然性が高いと思われます。各クラスには、予期しない文字が発生したときにnextToken()によって呼び出されるメソッドがあります。 ReaderBasedJsonParserの名前は_handleOddValue()で、UTF8StreamJsonParserの_handleUnexpectedValue()です。 "NaN"を数値として受け取り、ここで一重引用符で囲まれた文字列値を受け入れるようなもの。

私の計画は(私の感覚に襲われ、ひどいハックが私の短期的なニーズには十分であると気づく前に)これらのパーサーのどちらか/両方をサブクラス化し、上のメソッドをオーバーライドして引用符で囲まれていない文字列値を処理することでした。このメソッドは、入力ストリームがフィールド値のコンテキスト(コロンを認識した直後)のコンテキストにあるときに呼び出されるため、コンマまたは右中括弧に遭遇するまで前方参照を読み取ることが可能である必要があります。文字列値。このコードはJacksonのバッファリング戦略、パーサのアーキテクチャ(現在のバッファへの現在のポインタはインスタンス変数)などを理解する必要があるため、書くのは難しいです。ObjectMapperにこのカスタムパーサーを使用させるには、 JsonFactoryをサブクラス化し、_createParser()メソッドをインスタンス化するメソッドでオーバーライドします。パフォーマンスが重要でない場合は、通常のパーサーを強制的に使用するだけで十分ですが、通常とUTF-8パーサーの両方を正しく動作させるには、さらに多くの作業が必要になることがあります。次に、このカスタムJsonFactoryのインスタンスをObjectMapperのコンストラクタに渡すことができます。

これは誰かを助けることを望みます。

関連する問題