2

我目前正在开发一个应用程序,该应用程序将从 WoW 军械库中获取您的角色数据。示例角色:我的魔兽角色(链接)

我将通过调用暴雪提供的 API 来获得我想要的所有信息,我将在JSON. 示例JSON上述字符的 JSON 响应(链接)

起初我尝试从JSON字符串操作中获取数据。这意味着,拆分我的字符串,在字符串中搜索关键字以找到位置并将其格式化为单独的数据片段,例如才能和统计数据。

这在开始时效果很好,但是当我想要更多数据时,这变得更加困难,因为我在所有字符串上运行了许多函数,它变得非常模糊,不清楚当时我在做什么。

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

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

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

提前致谢。

4

3 回答 3

5

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

虽然自从 Delphi XE2 以来,您确实将 JSON 解析器作为 DB-Express 套件的一部分,但仍然存在一些问题:
1. 它被告知会导致速度和可靠性方面的问题。
2. 它会让你的程序依赖于 DB-Express 包(为什么,如果你没有真正使用它来访问 DB?) 3. 它将你的未来绑定到 Delphi 的企业版。

所以你最好尝试一些 3rd-party 库。

最快的一个可能是 Synopse JSON 解析器,他们的mORMot 库的副项目。它通常是很好的代码,非常注重速度和开发人员在他们的论坛上积极帮助。

另一个已知和使用的库是 Henri Gourvest 的 SuperObject。它声称是Delphi最快的解析器,虽然由于上述原因可能不再正确,但速度对于大多数任务来说已经足够了。Henri 本人并没有积极支持他的前项目,总是在做一些新的事情,所以稀缺的文档(也在安装包中复制)将是你正式拥有的全部,另外还有一个论坛,其他用户可能会帮助你。OTOH SuperObject 设计背后的主要思想是统一性,虽然某些任务确实可以更好地记录 - 这主要是由于不确定性“如果这项任务真的可以在没有任何特殊处理的情况下以统一的方式工作”。但通常是这样。
PS。由于那是 wiki,您可能会尝试为未来的用户增强它;-)

所以回到文档,你需要

1) 将整个 JSON 加载到库中。您可以通过 http 库创建 TStream 或提供带有数据的字符串缓冲区来做到这一点:即Parsing a JSON data structure section of the manual

2) 读取诸如“名称”和“级别”之类的值 -如何读取对象的属性值?那里的部分。

3) 征集像“人才”这样的数组 - 在浏览数据结构部分中进行了描述。

于 2012-12-17T16:47:46.230 回答
4

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

于 2012-12-17T10:29:18.283 回答
3

使用我的delphi-oop库中包含的TSvSerializer可以轻松完成您的任务。您只需要声明您的模型类型并从您的 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 项目中找到我的联系电子邮件,如果有不清楚的地方可以问我,我会在空闲时间尽力帮助您。

于 2012-12-17T12:39:48.340 回答