Некоторые сериализаторы JSON возвращают null
для пустого поля данных строки, например.SuperObject не может обрабатывать пустую строку
{
"searchtext": null,
"moretext": "contains something",
"bookdate": 1377468000000,
"empid": 12345,
"listtype": 1
}
Я использую надобъект создать ISuperObject:
var
FJSONRequest: ISuperObject;
then
FJSONRequest := SO(Request.Content); // Webservice request
Это возвращает объект со строкой, содержащей текст 'null'
.
Очевидно, что это связано с тем, что SuperObject не заботится о котировках ("searchtext": a
дает те же результаты, что и "searchtext": "a"
).
Перед тем, как погрузиться в подпрограмму токенизатора 980 строк, есть ли у кого-нибудь решение?
Я имею в виду вдоль линий (или/или):
оставить нулевой DataField из объекта JSON
возвращается пустая строка
Если все остальное терпит неудачу, я все еще мог бы сделать
FJSONRequest := SO(StringReplace(Request.Content,': null,',':,',[rfReplaceAll]));
, потому что мне нужно обрабатывать запросы, поступающие от приложения от одного из наших разработчиков, но это не является надежным.
(Нет, он не может подавить null
потому there's a bug in the way Mono handles his datacontract.)
КСТАТИ Я испытываю точно the behaviour mentioned here, но в другой части кода надобъекта, так что обходной путь не делает работу.
нуль это не то же самое, что и пустая строка. Это совершенно другое значение. Ваш 'StringReplace' не будет работать. Подумайте, что он делает с текстом, аннулированным. –
Установите мой stringReplace() более жестким, но действительно не надежным. –
Исправлена ошибка, о которой вы указали [исправлено более чем за год до ее появления] (https://code.google.com/p/superobject/source/detail?r=55d5b03a621bc2570e50da5d745ded4e9b0dfa12). И токенизация «null» также кажется правильной, поскольку Super Object правильно анализирует действительный JSON и вообще отклоняет недействительный JSON. Найдите [обработку состояния 'tsNull' в' TSuperObject.ParseEx'] (https://code.google.com/p/superobject/source/browse/superobject.pas#3400). Вы уверены, что используете последнюю версию кода? –