Как бороться с отсутствующим ключом JSON при использовании SuperObject для получения значений ключа?

#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'
 

конец;