#json #superobject
#json #суперобъект
Вопрос:
Использование SuperObject в Delphi 2009. Как мне справиться с ситуацией доступа к строковому значению ключа JSON, который может не существовать?
например, в этом примере кода JSONgood имеет ключ ‘key2’ и значение для него, но JSONbad не имеет ‘key2’ и поэтому вычисляется до нуля и вызывает ошибку, когда я пытаюсь преобразовать его в строку. Есть ли простой способ либо преобразовать значение nil в строковое значение, либо обнаружить его, прежде чем я попытаюсь прочитать его как строку, а не прочитать?
var
ParsedJSON : ISuperObject;
s : string;
JSONgood, JSONbad: string;
begin
JSONgood, = ''
' { '
' "key1": "one", '
' "key2": "not missing" '
' } '
ParsedJSON := SOJSONgood,
s := ParsedJSON ['key2'].AsString;
showmessage(s);
JSONbad: = ''
' { '
' "key1": "one" '
' } '
ParsedJSON := SOJSONbad:
s := ParsedJSON ['key2'].AsString; //key 2 does not exist so ParsedJSON ['key2'] is nil
showmeassage(s);
end;
Кстати, я пытался использовать X-Superobject, поскольку я понял, что это может справиться с этим, но он жаловался, что не может найти RegularExpressions или RTTI, указанные в предложении uses модуля XSuperJSON, поэтому я предполагаю, что это не будет работать в Delphi 2009 (и я не могу позволить себе более поздние версии Delphi)
редактировать — Добавление
If Assigned(ParsedJSON ['key2']) then ...
казалось, это удалось, но правильно ли это сделать?
Ответ №1:
Вот решение, которое я придумал.
Он работает немного как функция MySQL IFNULL(Value, DefaultValueIfNull)
и возвращает либо строковое значение, связанное с переданным ключом, либо, если ключ не существует, он возвращает заменяющий текст, переданный в функцию
function MissingKeySafeStr(theobject: ISuperObject; key: string; SubstituteText: string) : string;
begin
if theobject[key] = nil then
Result := SubstituteText
else
Result := theobject[key].AsString
end;
использование
procedure TForm1.Button1Click(Sender: TObject);
var
s : string;
obj : ISuperObject;
begin
s := '{"name":"jim"}';
obj := SO(s);
ShowMessage(MissingKeySafeStr(obj,'age', 'age key missing')); //displays ''age key missing'
ShowMessage(MissingKeySafeStr(obj,'name, 'name key missing')); //displays 'jim'
конец;