14

キーも値も引用符で囲まれていない JSON 文字列があり、正しくフォーマットされた JSON に変換したいと考えています。

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

それを処理できるJavaライブラリはありますか? ジャクソンを試しましたが、うまくいきません。

4

4 に答える 4

7

JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMESJackson で使用して、引用符で囲まれていないフィールド名を許可できます。

JsonFactory factory = new JsonFactory();
factory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
JsonParser jp = factory.createJsonParser(new FileInputStream("content.json"));
于 2013-02-21T14:54:57.383 に答える
1

Jackson をカスタマイズして、引用符で囲まれていないフィールド値 (フィールド名に対して) を処理する方法を調べました。代わりにハックを書くことになりましたが、他の人のためにパンくずリストをここに投稿しています。私のコード スペランキングは、Jackson 2.7.2 で行われました。

Jackson Core には、JsonParser インターフェースの具体的な実装が 2 つ付属しています。

  • ReaderBasedJsonParser、文字ストリームのパーサー (エンコーディングに依存しない)
  • UTF8StreamJsonParser、UTF-8 バイト ストリーム用に最適化されたパーサー

これら 2 つのクラスのコードは非常に冗長であり、おそらく必要に迫られています。各クラスには、予期しない文字が検出されたときに nextToken() によって呼び出されるメソッドがあります。ReaderBasedJsonParser の名前は _handleOddValue() で、UTF8StreamJsonParser の名前は _handleUnexpectedValue() です。「NaN」を数値として受け入れたり、単一引用符で囲まれた文字列値を許可したりするようなことがここで発生します。

私の計画 (私の感覚に来て、私の短期的なニーズにはひどいハックで十分であることに気付く前) は、これらのパーサーの 1 つまたは両方をサブクラス化し、上記のメソッドをオーバーライドして、引用符で囲まれていない文字列値を処理することでした。このメソッドは、入力ストリームがフィールド値のコンテキスト内にある場合 (コロンを認識した直後) に呼び出されるため、コンマまたは右中括弧が検出されるまで前方に読み取り、その時点までに読み取られたすべてを次のようにカウントできる必要があります。文字列値。このコードは、Jackson のバッファリング戦略、パーサーのアーキテクチャ (現在のバッファーへの現在のポインターはインスタンス変数) などを理解する必要があるため、書くのが難しいです。

ObjectMapper にこのカスタム パーサーを使用させるには、JsonFactory をサブクラス化し、それをインスタンス化するメソッドで _createParser() メソッドをオーバーライドする必要があります。通常のパーサーと UTF-8 パーサーの両方を正しく動作させるには、さらに作業が必要になる場合がありますが、パフォーマンスが問題にならない場合は、通常のパーサーを強制的に使用するだけで十分です。次に、このカスタム JsonFactory のインスタンスを ObjectMapper のコンストラクターに渡すことができます。

これが誰かに役立つことを願っています。

于 2016-04-21T16:13:43.043 に答える