2013-03-26 2 views
1

Я нашел несогласованность в методе writeNumber() в библиотеке процессоров Jackson JSON. При вызове writeNumber (String) в «NaN» с включенным QUOTE_NON_NUMERIC_NUMBERS не возвращается строка с кавычками. Это показано в следующем примере:Джексон: цитирование нечетных чисел несоответствие

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

Ожидается поведение, даже если оно кажется неинтуитивным. Это связано с строгим определением чисел в спецификации JSON в сочетании с потенциально открытым набором чисел, который имеет Java; трудно сочетать как безопасно, так и удобно.

В первом случае вы печатаете «необработанный» номер, используя точный формат, который вы хотите. Никакая цитата не добавляется, так как результат считается действительным номером JSON. Если вы хотите использовать двойные кавычки, вы их добавите. Это похоже на writeRaw(), за исключением того, что это явно значение write, что означает, что добавляются необходимые разделители (запятые в массивах, полуколонии между именем свойства и значением).

Во втором случае известно, что значение, которое вы должны выводить, не является допустимым номером JSON, и оно должно быть напечатано как строка JSON.

Смежные вопросы