0

REST Web サービスを使用する C# バージョン 4 アプリケーションをコーディングしています。これらの Web サービスは、ASP.NET MVC RESTful Web サービス アプローチで記述されています。これらの Web サービス メソッドの半分は、複数のルートを持つ JSON 文字列を返します(以下のサンプル JSON データを参照してください)。ただし、特定の JSON 応答 (以下を参照してください) については、複数ルートのJSON 応答文字列を、すべてのデータ応答ではなく、関心のある Device オブジェクト (たとえば、Device クラスに属する) に 部分的に逆シリアル化したいと考えています。

C# .NET ライブラリまたは JSON.net コードを使用して、ルートが 1 つしかない JSON 文字列を逆シリアル化する方法を知っています。しかし、複数ルートの JSON データをどのように処理すればよいかわかりません。ご意見をお聞かせください。ありがとうございました。

たとえば、次の JSON 応答では、"device" オブジェクト (Device クラスからインスタンス化された) のデータを取得し、"version_info" および "SKU_info" データを無視します。

次の JSON 応答には、「version_info」、「SKU_info」、「device」の 3 つのルートがあります。

{
     “version_info” : { “version” : “1.0”, “owner_id” : 237},
     “SKU_info” : {“id” : 1928399, “active”: true},
     “device” : {
           “id”: 7732, “name” : “desktop computer ”, “parent_device_id”: 2982,
           “sub_devices”: 
           [   
                    {“id”: 7733, “name”: “fan”, “quantity” : 1 }, 
                    {“id”: 7734, “name”: “memory chip”, “quantity” : 4 },
                    {“id”: 7735, “name”: “CPU”, “quantity” : 1 },
                    {“id”: 7736, “name”: “hard disk”, “quantity” : 2 },
           ],
           “user_id” : 864
      }
}

そして、私のカスタム「Device」および「SubDevice」クラス:

public class Device
{
    public long Id;
    public string Name;
    public long ParentDeviceId;
    public List<SubDevice> Subdevices;
    public int UserId;
}


public class SubDevice
{
    public long Id;
    public string Name;
    public int Quantity;
}
4

1 に答える 1

0

JSON 文字列にはルートがあります。無記名なだけです。

{  
     “version_info” : { “version” : “1.0”, “owner_id” : 237},
     “SKU_info” : {“id” : 1928399, “active”: true},
     “device” : {
           “id”: 7732, “name” : “desktop computer ”, “parent_device_id”: 2982,
           “sub_devices”: 
           [   
                    {“id”: 7733, “name”: “fan”, “quantity” : 1 }, 
                    {“id”: 7734, “name”: “memory chip”, “quantity” : 4 },
                    {“id”: 7735, “name”: “CPU”, “quantity” : 1 },
                    {“id”: 7736, “name”: “hard disk”, “quantity” : 2 },
           ],
           “user_id” : 864
      }
}

JSON をラップする{最初と最後}にある は、ルート オブジェクトを定義します。そのため、(好きな名前を付けて) オブジェクトを作成すると、新しいオブジェクトに逆シリアル化できます。

例えば:

public class Wrapper
{
     Version version_info { get; set; }
     SKU SKU_info { get; set; }
     Device device { get; set; }
}

無視するには、使用する予定のない動的オブジェクトに逆シリアル化するだけです。これはうまくいくかもしれません:

public class Wrapper
{
     dynamic version_info { get; set; }
     dynamic SKU_info { get; set; }
     Device device { get; set; }
}

Wrapper root = JsonConvert.DeserializeObject<Wrapper>(feed);
于 2013-02-03T15:30:44.003 に答える