繁体   English   中英

发现难以在delphi中处理JSON

[英]Finding it difficult to process JSON in delphi

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

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

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

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

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

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

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

提前致谢。

你的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软件包(为什么,如果你实际上没有用它来进行数据库访问?)3。它会将你的未来绑定到Delphi的企业版。

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

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

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

所以回到文档,你需要

1)将整个JSON加载到库中。 您可以通过http库创建TStream或使用数据提供字符串缓冲区来实现:即解析 手册 的JSON数据结构部分

2)读取“名称”和“级别”之类的值 - 在如何读取对象的属性值中描述 在那里。

3)登记像“talent”这样的数组 - 在浏览数据结构部分中描述。

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

使用我的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项目中找到我的联系电子邮件,询问我是否有不清楚的地方,我会尽量在业余时间帮助您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM