1

Jackson JSONプロセッサライブラリのwriteNumber()メソッドに不整合が見つかりました。QUOTE_NON_NUMERIC_NUMBERSを有効にして「NaN」でwriteNumber(String)を呼び出すと、引用符で囲まれた文字列を返すことができません。これを次の例に示します。

float nan = Float.NaN;
try {
    JsonGenerator jg = new JsonFactory().createGenerator(System.out);
    jg.enable(JsonGenerator.Feature.QUOTE_NON_NUMERIC_NUMBERS);

    // writeNumber(String s)
    jg.writeNumber(""+nan);

    // writeNumber(float f) 
    jg.writeNumber(nan);

    jg.close();
} catch (IOException e) {
    throw new RuntimeException(e);
}

実際の出力:

NaN "NaN"

期待される出力:

"NaN" "NaN"

これは予想される動作ですか、それともバグですか?

4

1 に答える 1

1

一見直感的ではないとしても、それは予想される動作です。これは、JSON仕様での数値の厳密な定義と、Javaが持つ潜在的に制限のない数値のセットによるものです。安全かつ便利にマッチングするのは難しいです。

最初のケースでは、必要な正確なフォーマットを使用して、「生の」数値を印刷しています。結果は有効なJSON番号であると見なされるため、引用符は追加されません。二重引用符が必要な場合は、それらを追加します。これは、明示的に値の書き込みである点を除いて、に似てwriteRaw()います。つまり、必要な区切り文字(配列内のコンマ、プロパティ名と値の間のセミコロン)も追加されます。

2番目のケースでは、出力する値が有効なJSON番号ではないことがわかっているため、JSON文字列として出力する必要があります。

于 2013-03-26T17:10:38.977 に答える