杰克逊:引用非数字数字不一致

时间:2013-03-26 03:15:53

标签: java json jackson

我发现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"

这是预期的行为还是错误?

1 个答案:

答案 0 :(得分:1)

这是预期的行为,即使看似不直观。这是由于JSON规范中对数字的严格定义,以及Java所具有的可能开放式的数字集;它很难安全方便地匹配。

在第一种情况下,您使用所需的精确格式打印“原始”数字。不添加引用,因为结果被假定为有效的JSON编号。如果你想要双引号,你会添加它们。这类似于writeRaw(),除了它显式是值写入,这意味着还添加了必要的分隔符(数组中的逗号,属性名称和值之间的分号)。

在第二种情况下,已知要输出的值不是有效的JSON编号,并且必须将其打印为JSON字符串。