2016-12-29 5 views
0

я не знаю, если это предназначено поведение или не Gson с использованием по умолчанию TypeAdapter.BOOLEAN, но не только не true и false (и струнных "true" и "false") получить десериализации как действительные булевых значений, но так делают TRUE и FALSE (и их версии String), True и False (и их версии String) и TrUe и fAlSe (и их версии String), а также любые искажения корпуса, которые вы хотели бы попробовать. Кроме того, поскольку TypeAdapter полагается на Java Boolean.parseBoolean(), любая ненулевая строка, которая не является некорректной обработкой "true", становится false.В Gson, как вы можете ограничить логическое значение true и false (а не TrUe и fAlSe)?

Я пишу TypeAdapter, и я хотел бы, чтобы только true и false быть приемлемыми булевы значения, но я не могу понять, как сказать, если значение, которое я собираюсь прочитать это true или True или TRUE или tRuE, так как я могу позвонить только nextBoolean(), и он вернет одинаковое значение для всех этих.

Есть ли способ получить исходное значение, чтобы я мог проверить, действительно ли это форма нижнего регистра или мне не повезло?

+1

Почему вы называете 'nextBoolean()', если следующий объект является строка ? Вы не можете получить строку и сделать логику? – lubilis

+0

По умолчанию 'TypeAdapter.BOOLEAN' принимает либо голые, некотируемые значения, либо строку (видимо, для обратной совместимости). Если я не буду приводить значение и помещать 'true' или' TRUE' или 'True' или' tRuE', 'JsonReader.peek()' возвращает 'JsonToken.BOOLEAN', и я могу только вызвать' nextBoolean() 'для получить значение. Попытка вызвать 'nextString()' выдает исключение. Другими словами, я не могу понять, как не допускать странные булевы. – TOB

+0

Конечно, я могу написать собственный 'TypeAdapter' для Booleans. Я должен реализовать 'public Boolean read (JsonReader in)'.Моя проблема заключается в том, что 'JsonReader' не предоставляет публичного способа рассказать разницу между токенами' true' и 'TRUE', и поскольку это единственное, к чему у меня есть доступ, когда я пишу' TypeAdapter', я не могу сказать разницы между ними. – TOB

ответ

0

Небольшое резюме раздела комментариев.

JsonReader использует целочисленное значение, чтобы использовать адаптер для получения соответствующего значения. В случае некотируемого значения, методы private int peekKeyword() будет проверять первый символ, как это:

if(c == 't' || c == 'T') -> BOOLEAN 
if(c == 'f' || c == 'F') -> BOOLEAN 
if(c == 'n' || c == 'N') -> NULL 

Так же принимаем заглавную даже если состояния IETF7159 в пункте 3

JSON значение MUST быть объект, массив, числа или строки, или один из следующих трех буквальных названий:

ложных нулевого истинные

буквальных имена MU ST - строчный. Других буквенных имен не допускается .

После того, как значение рассматривается как логическое, она будет преобразована с помощью Boolean.parseBoolean (строка ы), которая игнорирует случай строки (как и ожидалось) здесь

Я заметил, что OP есть открытая an issue на GitHub. Давайте посмотрим на ответы.

Этот API является своего рода пуленепробиваемые обновлять так что это не будет легко (или даже возможно), чтобы сделать некоторые изменения принятых ответов

+0

Принимая этот ответ, потому что он в основном говорит «НЕТ», что я считаю правильным. – TOB