发现难以在delphi中处理JSON

时间:2012-12-17 10:21:00

标签: json delphi api delphi-xe3 world-of-warcraft

我正在开发一个应用程序,它将从WoW军械库中获取你的角色数据。 示例字符:My WoW Character(link)

我将通过调用暴雪提供的API获取我想要的所有信息,我将在JSON中获得响应。 示例JSONJSON response for the character above(link)

首先,我尝试通过字符串操作从JSON获取数据。 这意味着,分割我的字符串,在字符串中搜索关键字以找到位置并将其格式化为各个数据,如人才和统计数据。

这在开始时效果很好但是因为我想要更多的数据这变得更难,因为我在所有字符串上运行的许多功能它只是变成了一个大模糊而且不清楚我在那一刻看到了什么。

有没有一种好方法来处理我的JSON? 我正在考虑获取JSON并创建一个空类。 在JSON工作时,它会生成属性并将值存储在那里。 但我不知道是否以及如何动态生成属性。

将来我想获得更多数据,但首先我想在开始考虑之前启动并运行。

有没有人对此有任何想法/建议?

提前致谢。

3 个答案:

答案 0 :(得分:5)

你的JSON看起来很简短和基本。它似乎不需要特殊的速度或异国情调的功能。 http://jsonviewer.stack.hu/#http://eu.battle.net/api/wow/character/moonglade/Xaveak?fields=stats,talents

虽然自Delphi XE2以来你真的有库存JSON解析器作为DB-Express套件的一部分,但仍然有顾虑:
它被告知会导致速度和可靠性方面的问题 2.它会让你的程序依赖于DB-Express包(为什么,如果你实际上没有用它来进行数据库访问?) 它会将你的未来与Delphi企业版捆绑在一起。

所以你最好尝试一些第三方库。

其中最快的可能是Synopse JSON解析器,他们mORMot library的侧面项目。它通常是很好的代码,非常注重速度,开发人员积极帮助他们的论坛。

另一个已知和使用的库是Henri Gourvest的SuperObject。 它声称对于Delphi来说是the fastest parser,虽然由于上述情况可能不再那么真实,但速度对于大多数任务来说已经足够了。 Henri本人并没有积极支持他的前项目,总是做一些新的事情,所以the scarce documentation(也在安装包中重复)将是你正式的,加上there is a forum其他用户可能会帮助你。 OTOH SuperObject设计背后的主要思想是一致性,虽然一些任务可以更好地记录 - 这主要是由于不确定性“如果这个任务真的可以在没有任何特殊处理的情况下在统一的事情上工作”。但通常情况确实如此 PS。由于这是wiki,您可以尝试为将来的用户增强它; - )

回到文档,你需要

1)将整个JSON加载到库中。您可以通过http库创建TStream或通过数据提供字符串缓冲区来实现:{strong>解析JSON数据结构部分the manual

2)读取“name”和“level”之类的值 - 在如何读取对象的属性值?部分中描述。

3)登记“人才”等数组 - 在浏览数据结构部分中描述。

答案 1 :(得分:4)

XE3具有“内置”JSON支持(请参阅docwiki),但我听说(自己没有使用过)它没有得到很好的优化。 所以也许可以寻找像SuperObject这样的第三方选项。

答案 2 :(得分:3)

使用TSvSerializer库中包含的delphi-oop可轻松完成您的任务。您只需要声明您的模型类型并从您的json字符串反序列化它。您的模型(非常简化的不完整和未经测试的版本)应如下所示:

type
  TStats = class
  public
    property health: Integer read fhealth write Fhealth;
    ... 
  end;

  TTalent = class
  public
    property tier: Integer read Ftier write Ftier;
    ...
  end;

  TMainTalent = class
  public
    property selected: Boolean read Fselected write Fselected;
    property talents: TObjectList<TTalent> read Ftalents write Ftalents;
  end;

  TWowCharacter = class
  public
    property lastModified: Int64 read FlastModified write FlastModified;
    property name: string read Fname write Fname;
    ...
    property stats: TStats read Fstats write Fstats;
    property talents: TObjectList<TMainTalent> read Ftalents write Ftalents;
    ...
  end;

然后你只需要这样做:

uses
  SvSerializer;

var
  LWowCharacter: TWowCharacter;
begin
  LWowCharacter := TWowCharacter.FromJson(YourJsonString);
...

你可以在delphi-oop项目中找到我的联系电子邮件,问我是否有不清楚的地方,我会尽量帮助你。