生活绑定JSON对象和数组

Sco*_*ard 2 delphi firemonkey livebindings firemonkey-fm3 delphi-xe5

晚上好.

我目前正试图掌握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
}
Run Code Online (Sandbox Code Playgroud)

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

在我的应用程序中,我有TRESTClient,TRESTRequest,TRESTResponse,TRESTResponseDataSetAdapter,TClientDataSet和TBindSourceDB组件.我还有一个TButton,一个TMemo和一个TListView.我已经设法通过livebindings挂起所有组件,当我单击按钮(执行请求)时,通过调用返回的整个数据显示在备忘录中.

我正在努力的是将数据链接到ListView.我创建了FieldDefs用于TClientDataSource本身(这是相对于字面树视图ChildDefs);

  • | --result(类型:ftString)
  • | --response(类型: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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sco*_*ard 8

我想到了;

  • 设置REST组件
  • 对于TRESTResponseDataSetAdapter,将它的RootElement属性设置为response.ips
  • 然后,添加等领域ip,classification,hits,latitude,longitude,和zone_name因为它是FieldDefs
  • 右键单击TRESTResponseDataSetAdapter并选择"更新数据集"
  • Livebind的领域之一来自TRESTResponseDataSetAdapteritem.text财产TListView

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