大家晚上好。
我目前正在开发产品WinFlare的跨平台兼容版本。我面临的问题是SuperObject仍不能与Firemonkey跨平台兼容。无论如何,我在产品的原始版本中使用了它,但是现在我想创建一个跨平台版本,而不是仅限于Windows的版本,我发现这很麻烦。
经过大量的研究,DBXJSON
是我唯一能够找到的跨平台解决方案,但是事实证明,尝试进行处理令人沮丧。我为此找到的大多数示例都不适用于我的情况,或者它们太复杂以至于无法从中获取有用的信息。有很多讨论,但我只是在努力解决SuperObject如此简单的任务。今天晚上,我花了大部分时间来尝试寻找可以构建的东西,但是我所做的一切都使我回到了第一位。
理想情况下,我想修复SuperObject,但是我缺乏深入的知识,无法使其与OS X跨平台兼容(并准备用于移动工作室)。我欢迎您提出任何建议,但是由于我想没有人有时间完成如此巨大的任务,因此DBXJSON似乎是我唯一的选择。
我要处理的JSON布局仍然相同;
{
response: {
ips: [
{
ip: "xxx.xxx.xxx.xxx",
classification: "threat",
hits: xx,
latitude: xx,
longitude: xx,
zone_name: "domain-example1"
},
{
ip: "yyy.yyy.yyy.yyy",
classification: "robot",
hits: yy,
latitude: xx,
longitude: xx,
zone_name: "domain-example2"
}
]
}
result : "success",
msg: null
}
ips
数组中可以有数百个结果。假设我要解析数组中的所有项目并提取每个latitude
值。让我们还假设一秒钟,我打算将它们输出到数组。这是我想使用的代码模板。procedure ParseJsonArray_Latitude(SInput : String);
var
i : Integer;
JsonArray : TJsonArray;
Begin
// SInput is the retrieved JSON in string format
{ Extract Objects from array }
for i := 0 to JsonArray.Size-1 do
begin
Array_Latitude[i] := JsonArray.Item[i].ToString;
end;
end;
从本质上讲,在
{ Extract Objects from array }
处,我想要使用DBXJSON的最基本解决方案来解决我的问题。显然,我在上面的模板中显示的与JsonArray
相关的呼叫可能是不正确的-它们只是在这里提供帮助。 最佳答案
首先,解析字符串以获取对象。
var
obj: TJsonObject;
obj := TJsonObject.ParseJsonValue(SInput) as TJsonObject;
这样就为您提供了一个具有三个属性的对象,即响应,结果和味精。尽管
ParseJsonValue
是TJsonObject
的方法,并且您输入的特定字符串恰好表示一个对象值,但它可以返回任何TJsonValue
后代的实例,具体取决于给出的JSON文本。知道从哪里开始可能是与DbxJson合作最困难的部分。接下来,获取响应属性值。
response := obj.Get('response').JsonValue as TJsonObject;
该结果应该是另一个对象,这次具有一个属性ips。获取该属性,该属性应具有一个值的数组。
ips := response.Get('ips').JsonValue as TJsonArray;
最后,您可以从数组中获取值。看起来您期望值是数字,所以可以这样进行转换。
for i := 0 to Pred(ips.Size) do
Array_Latitude[i] := (ips.Get(i) as TJsonObject).Get('latitude').JsonValue as TJsonNumber;
完成后,请记住释放
obj
,但不要释放此处提到的其他变量。