首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Json解析“无效的类类型转换”问题。[Delphi XE7]

Json解析“无效的类类型转换”问题。[Delphi XE7]
EN

Stack Overflow用户
提问于 2016-07-22 04:26:46
回答 2查看 7.1K关注 0票数 1

我正在尝试使用Delphi XE7解析来自Twitter API的JSON结果。我得到了一个“无效的类类型转换”错误,但是我用一个在线验证器检查了JSON,它是正常的。

以下是JSON结果:

代码语言:javascript
运行
复制
[
  {
    "trends":
    [
      {
        "name":"#OneDirectionIsOverParty",
        "url":"http://twitter.com/search?q=%23OneDirectionIsOverParty",
        "promoted_content":null,
        "query":"%23OneDirectionIsOverParty",
        "tweet_volume":410022
      },
      {
        "name":"#TheDarkKnight",
        "url":"http://twitter.com/search?q=%23TheDarkKnight",
        "promoted_content":null,
        "query":"%23TheDarkKnight",
        "tweet_volume":null
      },
      {
        "name":"#QuintaComOClubeSdv",
        "url":"http://twitter.com/search?q=%23QuintaComOClubeSdv",
        "promoted_content":null,
        "query":"%23QuintaComOClubeSdv",
        "tweet_volume":23756
      }
    ],
    "as_of":"2016-07-21T20:14:13Z",
    "created_at":"2016-07-21T20:08:31Z",
    "locations":
    [
      {
        "name":"Worldwide",
        "woeid":1
      }
    ]
  }
]

这是我的解析函数:

代码语言:javascript
运行
复制
procedure ParseJSON(const JSON: string);
var
 JSONObject: TJSONObject;
 MessageText: TJSONArray;
 NodeDetails: TJSONObject;
 MsgDetail: TJSONString;
 I: Integer;
 Item: TListItem;
begin
 JSONObject := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(JSON), 0) as TJSONObject;
 MessageText := JSONObject.Get('trends').JSONValue as TJSONArray;

for I := 0 to TJSONArray(MessageText).Size - 1 do
begin
  Item := Form1.ListView1.Items.Add;
  NodeDetails := MessageText.Get(I) as TJSONObject;
  MsgDetail := NodeDetails.Get('query').JSONValue as TJSONString;
  Item.Caption := MsgDetail.Value;
end;

实际上,这个函数可以与Twitter API中的其他JSON结果一起使用。它不仅仅在这一个结果上工作。

EN

回答 2

Stack Overflow用户

发布于 2016-07-22 04:36:20

代码语言:javascript
运行
复制
JSONObject := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(JSON), 0) as TJSONObject;

JSON的根是一个数组,而不是一个对象。因此出现了错误。

您需要将ParseJSONValue()的返回值转换为TJSONArray而不是TJSONObject,然后就可以访问数组中的第一个元素并读取它的trends值。您已经有了解析数组的代码,因此您清楚地知道如何做这件事。

如果您不清楚对象和数组的JSON术语,请阅读JSON spec

票数 7
EN

Stack Overflow用户

发布于 2016-07-22 08:22:02

正如David所指出的,问题在于您的代码假设JSON文本是一个对象,而在本例中它是一个数组。

在代码不知道特定的JSON容器是对象还是数组的情况下,my alternative JSON library提供了一种处理这种情况的方法,它提供了一个专门用于处理JSON的TJSONText类,在这种情况下您不必知道(或关心)所涉及的JSON是对象还是数组。

在您的示例中,结果代码将类似于:

代码语言:javascript
运行
复制
response := TJSONText.CreateFromUTF8(JSON);

case response.ValueType of
  jsArray  : MessageText := response.AsArray[0].AsObject['trends'].AsArray;
  jsObject : MessageText := NIL;  // or as appropriate to extract "trends" from a single object response
end;

if Assigned(MessageText) then
begin
  .. etc etc
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38513753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档