こんばんは。
私は現在、現在のプロジェクトの 1 つを更新したいので、Delphi で livebindings を理解しようとしています (他のプラットフォームへのプッシュ、パフォーマンスの最適化、コードの最小化を目的として、ベースから完全に作り直しています)。JSON データを返す Web API を使用しています。1 つのサンプル呼び出しで返される 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
}
ご覧のとおり、これは配列とさまざまな型 (string、float、integer など) のいくつかのデータ フィールドを持つ JSON オブジェクトです。
私のアプリケーション内には、TRESTClient、TRESTRequest、TRESTResponse、TRESTResponseDataSetAdapter、TClientDataSet、および TBindSourceDB コンポーネントがあります。TButton、TMemo、TListView も用意しました。すべてのコンポーネントを livebindings 経由でフックすることができました。ボタン (リクエストを実行する) をクリックすると、呼び出しから返されたデータ全体がメモに表示されます。
私が苦労しているのは、データを ListView にリンクすることです。をそのまま作成しましたFieldDefs
(TClientDataSource
これは に関連する文字通りのツリー ビューChildDefs
です)。
- |--結果 (タイプ: ftString)
- |--response (タイプ: ftObject)
- |--|--ips (タイプ: ftArray、サイズ: 6)
- |--|--|-- ip (タイプ: ftString)
- |--|--|-- 分類 (タイプ: ftString)
- |--|--|-- ヒット (タイプ: ftInteger)
- |--|--|-- 緯度 (型: ftFloat)
- |--|--|-- 経度 (型: ftFloat)
- |--|--|-- ゾーン名 (タイプ: ftString)
response.ips[0]
次に、BindSourceDB1を TListView のフィールドにライブバインド/ライブバインドしましたItem.Text
。残念ながら、アプリケーションを実行してリクエストを実行すると、エラーが発生します。
ClientDataSet1: Field 'response.ips[0]' not found
この例でresponse.ips[index].ip
は、配列内の各項目のフィールドを取得し、TListView 内の個々の項目として出力しようとしています。残念ながら、response.ips
インデックスなしでフィールドをライブバインドしても、同様のエラーが発生します。ただし、result
フィールドにリンクすると、期待どおりリストビュー内に「成功」メッセージが返されます。
Jim McKeeth の REST クライアントの例を見て、現在のポイントにたどり着きましたが、それを自分のデータに適応させる方法を考えるのは少し難しいことがわかりました。TRESTResponseDataSetAdapter にも独自のFieldDefs
プロパティがあることに気付いたので、そこにフィールドを定義する必要があるかどうかわかりません。
データ型の設定が間違っているか、些細なことを見逃していると思いますが、何か助けていただければ幸いです。