LiveBinding объекты и массивы JSON
Всем добрый вечер.
В настоящее время я пытаюсь разобраться с живыми привязками в Delphi, поскольку я хотел бы обновить один из моих текущих проектов (завершить доработку из базы с целью продвижения на другие платформы, оптимизации производительности и минимизации кода). Я работаю с веб-API, который возвращает данные JSON. Возвращенный формат 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-объект с массивом и некоторыми полями данных различных типов (string, float, integer и т. Д.).
В моем приложении есть компоненты TRESTClient, TRESTRequest, TRESTResponse, TRESTResponseDataSetAdapter, TClientDataSet и TBindSourceDB. У меня также есть TButton, TMemo и TListView. Мне удалось подключить все компоненты через живые привязки, и все данные, возвращенные после вызова, отображаются в памятке, когда я нажимаю кнопку (которая выполняет запрос).
Я борюсь за то, чтобы связать данные с ListView. Я создал FieldDefs
для TClientDataSource
как таковой (это буквальное представление дерева по отношению к ChildDefs
);
- | --result (Тип: ftString)
- | --response (Тип: ftObject)
- | - |--ips (Тип: ftArray, Размер: 6)
- | - | - | - ip (Тип: ftString)
- | - | - | - классификация (Тип: ftString)
- | - | - | - Хиты (Тип: ftInteger)
- | - | - | - широта (Тип: ftFloat)
- | - | - | - долгота (Тип: ftFloat)
- | - | - | - имя_зоны (тип: ftString)
Я тогда вживую / в прямом эфире BindSourceDB1's response.ips[0]
в TListView Item.Text
поле. К сожалению, когда я запускаю приложение и выполняю запрос, я получаю ошибку;
ClientDataSet1: Field 'response.ips[0]' not found
В этом случае я пытаюсь получить response.ips[index].ip
поле каждого элемента в массиве и вывести его как отдельный элемент в TListView. К сожалению, даже вживую response.ips
Поле без индекса по-прежнему представляет аналогичную ошибку. Однако, если я свяжу это с result
поле, затем он возвращает сообщение об успехе внутри списка, как и ожидалось.
Я взглянул на пример REST-клиента Джима МакКита, и это дало мне представление о текущем моменте, но разработка того, как адаптировать его для моих собственных данных, оказывается немного сложной задачей. Я заметил, что TRESTResponseDataSetAdapter также имеет свой собственный FieldDefs
собственности, поэтому я не уверен, должен ли я определять свои поля там или нет.
Я предполагаю, что только что неправильно настроил типы данных или пропустил что-то незначительное, но я был бы признателен за любую помощь.
1 ответ
Я понял;
- Настройте компоненты REST
- Для
TRESTResponseDataSetAdapter
установите этоRootElement
собственность наresponse.ips
- Затем добавьте поля
ip
,classification
,hits
,latitude
,longitude
, а такжеzone_name
как этоFieldDefs
- Щелкните правой кнопкой мыши
TRESTResponseDataSetAdapter
и выберите "Обновить набор данных" - Livebind одно из полей из
TRESTResponseDataSetAdapter
кitem.text
собственностьTListView
Приложение тогда работало правильно и правильно отображало данные.