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(),除了它显式地写入值,这意味着还添加了必要的分隔符(数组中的逗号,属性名称和值之间的分号)。

在第二种情况下,已知您要输出的值不是有效的 JSON 数字,它必须打印为 JSON 字符串。

于 2013-03-26T17:10:38.977 回答