我目前正在开发一个应用程序,该应用程序将从魔兽世界军械库中获取角色的数据。示例角色:我的魔兽世界角色(链接)
我将通过调用暴雪提供的API获得我想要的所有信息,我将在JSON
中得到响应。示例JSON
:上面的字符(链接)的JSON响应
起初,我尝试通过字符串操作从JSON
中获取数据。这意味着,拆分我的字符串,在字符串中搜索关键字以找到位置,并将其格式化为单独的数据片段,如天赋和统计数据。
这在一开始效果很好,但由于我想要更多的数据,这变得更难了,因为我在所有字符串上运行了许多函数,这变得非常模糊,不清楚我当时在做什么。
有没有一个好的方法来处理我的JSON
?我正在考虑获得JSON
并创建一个空类。在处理JSON
时,它将生成属性并将值存储在其中。但我不知道是否以及如何可能动态生成属性。
在未来,我想获得更多的数据,但首先我想在考虑之前就把它启动并运行起来。
有人对此有什么想法/建议吗?
提前谢谢。
您的JSON看起来相当简短和基本。你似乎不需要特殊的速度或奇异的功能。http://jsonviewer.stack.hu/#http://eu.battle.net/api/wow/character/moonglade/Xaveak?fields=stats,人才
尽管从DelphiXE2开始,作为DB-Express套件的一部分,您确实拥有常用的JSON解析器,但仍然存在一些问题:
1。它被告知会在速度和可靠性方面造成问题
2.这会使您的程序依赖于DB Express包(如果您实际上没有将其用于DB访问,为什么?)3.它将把你的未来与德尔福的企业版绑定在一起。
所以你最好试试第三方图书馆。
其中速度最快的可能是Synapse JSON解析器,它是他们的mORMot库的辅助项目。一般来说,这是一个很好的代码,非常注重速度,开发人员在论坛上积极提供帮助。
一个更为人所知和使用的图书馆将是Henri Gouvest的SuperObject。它声称是Delphi中速度最快的解析器,尽管由于以上原因,这可能不再是事实,但速度对于大多数任务来说都足够了。Henri本人并不积极支持他以前的项目,总是做一些新的事情,所以稀缺的文档(也在安装包中重复)将是你官方拥有的全部,此外还有一个论坛,其他用户可能会帮助你。OTOH超级对象设计背后的主要思想是一致性,虽然一些任务确实可以更好地记录下来,但这主要是由于不确定性,"如果这个任务真的在没有任何特殊处理的情况下在一致的物质中工作"。但通常是这样
PS。既然这是wiki,你可以尝试为未来的用户增强它;-)
所以回到文档,你需要
1) 将整个JSON加载到库中。您可以通过http库创建TStream或为数据提供字符串缓冲区来实现这一点:即手动的解析JSON数据结构部分
2) 读取诸如"name"one_answers"level"之类的值-如中所述如何读取对象的属性值部分。
3) 招募像"人才"这样的数组-如浏览数据结构部分所述。
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);
...
你可以在Delphioop项目中找到我的联系电子邮件,问我是否有什么不清楚的地方,我会在业余时间尽力帮助你。