0

在 Delphi 2009 中使用 SuperObject。如何处理访问可能不存在的 JSON 键的字符串值的情况?

例如,对于这个示例代码,JSONgood 有一个键“key2”和一个值,但 JSONbad 没有一个“key2”,因此当我尝试将其转换为字符串时,它的计算结果为 nil 并导致错误。有没有一种简单的方法可以将 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,因为我知道它可以处理这个问题,但是抱怨它找不到在单元 XSuperJSON 的使用子句中命名的正则表达式或 RTTI,所以我猜它在 Delphi 2009 中不起作用(而且我买不起后来的 Delphi 版本)

编辑 - 添加

If Assigned(ParsedJSON ['key2']) then ... 

似乎这样做了,但这是正确的方法吗?

4

1 回答 1

0

这是我想出的解决方案。

它的工作方式有点像 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'

结尾;

于 2020-12-23T16:13:29.753 回答