2

こんばんは。

私は現在、現在のプロジェクトの 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プロパティがあることに気付いたので、そこにフィールドを定義する必要があるかどうかわかりません。

データ型の設定が間違っているか、些細なことを見逃していると思いますが、何か助けていただければ幸いです。

4

1 に答える 1

8

私はそれを考え出した;

  • REST コンポーネントをセットアップする
  • の場合、そのプロパティをTRESTResponseDataSetAdapterに設定しますRootElementresponse.ips
  • 次に、フィールドipclassificationhitslatitudelongitude、およびzone_nameをそのまま追加します。FieldDefs
  • を右クリックしTRESTResponseDataSetAdapter、[DataSet の更新] を選択します。
  • のフィールドの 1 つをTRESTResponseDataSetAdapteritem.textプロパティにライブバインドします。TListView

その後、アプリケーションは正しく機能し、データを正しく反映しました。

于 2013-11-03T20:11:02.463 に答える