大家晚上好。

我目前正在开发产品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;


这样就为您提供了一个具有三个属性的对象,即响应,结果和味精。尽管ParseJsonValueTJsonObject的方法,并且您输入的特定字符串恰好表示一个对象值,但它可以返回任何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,但不要释放此处提到的其他变量。

08-05 07:17
查看更多