晚上好。
我目前正试图掌握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。我已经设法通过livebindings挂起所有组件,当我点击按钮(执行请求)时,通过调用返回的整个数据显示在备忘录中。
我正在努力将数据链接到ListView。我已经为FieldDefs
创建了TClientDataSource
(这是与ChildDefs
相关的文字树视图);
然后我将生活绑定/活动BindSourceDB1的response.ips[0]
发送到TListView的Item.Text
字段。不幸的是,当我运行应用程序并执行请求时,我收到错误;
ClientDataSet1: Field 'response.ips[0]' not found
在这个例子中,我正在尝试检索数组中每个项目的response.ips[index].ip
字段,并将其作为TListView中的单个项目输出。不幸的是,即使没有索引的response.ips
字段的实时绑定仍然存在类似的错误。但是,如果我将其链接到result
字段,则会按预期在列表视图中返回“成功”消息。
我确实看了一下Jim McKeeth's REST client example,这让我想到了当前的观点,但是如何根据我自己的数据进行调整是很有挑战性的。我注意到TRESTResponseDataSetAdapter也有它自己的FieldDefs
属性,所以我不确定是否应该在那里定义我的字段。
我想我的数据类型设置不正确或遗漏了一些小问题,但我很感激您的帮助。
答案 0 :(得分:8)
我弄清楚了;
TRESTResponseDataSetAdapter
,将其RootElement
属性设置为response.ips
ip
,classification
,hits
,latitude
,longitude
和zone_name
,因为它是{{1} } FieldDefs
并选择“更新数据集”TRESTResponseDataSetAdapter
TRESTResponseDataSetAdapter
到item.text
属性中的一个字段
然后,应用程序正常工作并正确反映数据。