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

Приложение тогда работало правильно и правильно отображало данные.

Другие вопросы по тегам