我发现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"
这是预期的行为还是错误?
答案 0 :(得分:1)
这是预期的行为,即使看似不直观。这是由于JSON规范中对数字的严格定义,以及Java所具有的可能开放式的数字集;它很难安全方便地匹配。
在第一种情况下,您使用所需的精确格式打印“原始”数字。不添加引用,因为结果被假定为有效的JSON编号。如果你想要双引号,你会添加它们。这类似于writeRaw()
,除了它显式是值写入,这意味着还添加了必要的分隔符(数组中的逗号,属性名称和值之间的分号)。
在第二种情况下,已知要输出的值不是有效的JSON编号,并且必须将其打印为JSON字符串。