1

現在NuGetで利用可能なバージョンであるSystem.Net.Http.HttpClientを使用して、json形式でサービスからデータを取得しています。データはおおよそ次のようになります。

{
  "schema": "Listing",
  "data": {
    "key": "28ba648c-de24-45d4-a7d9-70f810cf5438",
    "children": [{
      "kind": "type1",
      "data": {
        "body": "Four score and seven years ago...",
        "parent_id": "2qh3l",
        "report_count": 0,
        "name": "c4j6yeh"
      }
    }, {
      "kind": "type3",
      "data": {
        "domain": "abc.def.com",
        "flagged": true,
        "category": "news",
        "saved": false,
        "id": "t3dz0",
        "created": 1335998011.0
        }
    }]
  }
}

私はHttpContentExtensions.ReadAsAsync<T>そのjson文字列をオブジェクトグラフに逆シリアル化するために使用します。タイプ定義はおおよそ次のようになります。

public class Response
{
    public String schema { get;set; }
    public ListingData data { get;set; }
}

public class ListingData
{
    public string key { get;set; }
    public List<OneItem> children { get;set; }
}

childrenここに問題があります:私はアイテムのタイプがプロパティによって異なることを望みkindます。が「type1」の場合kind、オブジェクトを逆シリアル化します...それを呼び出しましょうType1。が「type3」の場合kind、タイプのオブジェクトが必要ですType3

現在、aList<Type1>またはaを逆シリアル化できますが、逆シリアルList<Type3>化ロジックに2つを区別するように指示する方法がわかりません。

「type1」データオブジェクトと「type3」データオブジェクトのすべてのプロパティを単一の.NETタイプにマージできます。しかし、プロパティの数は十分に多いため、これは厄介になります。

JSONのプロパティの名前(この場合data)が異なる場合は、それを使用して区別できます。たとえば、データが次のようになっている場合:

    "children": [{
      "kind": "type1",
      "t1data": { ... }
    }, {
      "kind": "type3",
      "t3data": { ... }
    }]

...次に、.NETで次のようなことを行うことができます。

public class OneItem
{
    public string kind { get;set; }
    public Type1 t1data { get;set; }
    public Type3 t3data { get;set; }
}

しかし、私のデータスキーマはそのようには見えません。

データの内容によって逆シリアル化のタイプを選択することは可能ですか?つまり、1つのプロパティ(この場合は)の値を調べてkind、別のプロパティ(この場合は)のコンテンツを逆シリアル化する方法を決定しますdata

または、ReadAsAsyncがJSONを逆シリアル化しようとする前に、JSONに作用するフィルターまたはトランスフォーマーを挿入することは可能ですか?

もしそうなら、どのように?

4

1 に答える 1