首页 > 解决方案 > 带有 SuperObject 的 JSON:元素是数组还是对象?

问题描述

我从 API 获取 JSON,它有一个怪癖:通常它返回“标签”元素作为对象 {“x”:“y”},但如果没有标签,它会返回空数组 []。

我用 SuperObject 解析 JSON,并使用以下代码:

var
  JsonObject: ISuperObject;
  item: TSuperAvlEntry;
  temp: TStringList;
begin
{...}
      for item in JsonObject.O['tags'].AsObject do
      begin
        temp.Add(item.Name);
      end;
{...}

它对对象非常有效,但如果它是一个数组,它会因访问冲突错误而崩溃。

同样,如果我尝试类似:

if JSONObject['tags'].AsArray.Length=0 then

它适用于空数组,但如果它是一个对象则会崩溃。

我不确定元素可能在“标签”中,因此不知道在这种情况下如何使用 Exists()。

有任何想法吗?

标签: jsondelphisuperobject

解决方案


好吧,看来我自己找到了答案,所以我会分享它。

ISuperObject 有一个属性“DataType”,您可以检查它,如下所示:

if JsonObject['tags'].DataType = stObject then
begin
  for item in JsonObject.O['tags'].AsObject do
  begin
    temp.Add(item.Name);
  end;
end;

stObject 和 stArray 对检查最有用,但还有:stBoolean、stDouble、stCurrency、stInt 和 stMethod。


推荐阅读