2

大家晚上好。

我目前正在尝试掌握 Delphi 中的实时绑定,因为我想刷新我当前的一个项目(从基础进行完全返工,以便推送到其他平台、优化性能和最小化代码)。我正在使用返回 JSON 数据的 Web API。一个示例调用返回的 JSON 格式如下所示;

{
  "response": {
    "ips": [
      {
        "ip": "111.222.333.444",
        "classification": "regular",
        "hits": 134,
        "latitude": 0.0000,
        "longitude": 0.0000,
        "zone_name": "example.com"
      },
      {
        "ip": "555.666.777.888",
        "classification": "regular",
        "hits": 134,
        "latitude": 50.0000,
        "longitude: 50.0000,
        "zone_name": "example-2.com"
      },
    ]
},
"result": "success",
"msg": null
}

如您所见,它是一个 JSON 对象,带有一个数组和一些各种类型的数据字段(字符串、浮点数、整数等)。

在我的应用程序中,我有 TRESTClient、TRESTRequest、TRESTResponse、TRESTResponseDataSetAdapter、TClientDataSet 和 TBindSourceDB 组件。我还有一个 TButton、一个 TMemo 和一个 TListView。我已经设法通过实时绑定将所有组件连接起来,并且当我单击按钮(执行请求)时,从调用返回的整个数据都显示在备忘录中。

我正在努力的是将数据链接到 ListView。我已经为此创建了FieldDefsTClientDataSource这是与 相关的字面树视图ChildDefs);

  • |--结果(类型:ftString)
  • |--响应(类型:ftObject)
  • |--|--ips(类型:ftArray,大小:6)
  • |--|--|-- ip (类型: ftString)
  • |--|--|-- 分类(类型:ftString)
  • |--|--|-- 命中(类型:ftInteger)
  • |--|--|-- 纬度(类型:ftFloat)
  • |--|--|-- 经度(类型:ftFloat)
  • |--|--|-- zone_name (类型: ftString)

然后,我将 Livebinded/livebound BindSourceDB1 绑定response.ips[0]到 TListView 的Item.Text字段。不幸的是,当我运行应用程序并执行请求时,我得到了一个错误;

ClientDataSet1: Field 'response.ips[0]' not found

在这种情况下,我试图检索response.ips[index].ip数组中每个项目的字段,并将其作为 TListView 中的单个项目输出。不幸的是,即使在response.ips没有索引的情况下实时绑定字段仍然会出现类似的错误。但是,如果我将它链接到该result字段,那么它会按预期在列表视图中返回“成功”消息。

我确实查看了Jim McKeeth 的 REST 客户端示例,这让我明白了当前的观点,但要弄清楚如何根据我自己的数据进行调整是有点挑战的。我注意到 TRESTResponseDataSetAdapter 也有它自己的FieldDefs属性,所以我不确定是否应该在那里定义我的字段。

我想我只是数据类型设置不正确或遗漏了一些小问题,但我会很感激任何帮助。

4

1 回答 1

8

我想到了;

  • 设置您的 REST 组件
  • 对于TRESTResponseDataSetAdapter, 将其RootElement属性设置为response.ips
  • 然后,添加字段ip, classification, hits, latitude, longitude, 和zone_name原样FieldDefs
  • 右键单击TRESTResponseDataSetAdapter并选择“更新数据集”
  • 将字段之一从 绑定TRESTResponseDataSetAdapter到 的item.text属性TListView

然后应用程序正常工作并正确反映数据。

于 2013-11-03T20:11:02.463 回答