2013-02-03 4 views
0

저는 REST 웹 서비스를 사용하는 C# 버전 4 응용 프로그램을 코딩하고 있습니다. 이러한 웹 서비스는 ASP.NET MVC RESTful 웹 서비스 방식으로 작성됩니다. 이러한 웹 서비스 메소드의 절반은 다중 루트 (아래 JSON 데이터 샘플을 참조하십시오)으로 JSON 문자열을 반환합니다. 그러나 특정 JSON 응답 (아래 참조)에 대해서는 모든 데이터 대신 관심있는 Device 객체 (예 : Device 클래스에 속한)에 다중 루트 JSON 응답 문자열을 부분적으로 deserialize하고 싶습니다. 응답.여러 뿌리가있는 JSON 문자열의 부분 비 직렬화

C# .NET 라이브러리 또는 JSON.net 코드를 사용하여 하나의 루트 만있는 JSON 문자열을 역 직렬화하는 방법을 알고 있습니다. 하지만 다중 루트 JSON 데이터로하는 방법을 모르겠습니다. 제발 조언. 고맙습니다.

예를 들어, 다음과 같은 JSON 응답으로 "device"객체 (Device 클래스에서 인스턴스화 됨)에 대한 데이터를 검색하고 "version_info"및 "SKU_info"데이터를 무시합니다. "version_info", "SKU_info"및 "장치":

{ 
    “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 
     } 
} 

그리고 내 csutom "장치"와 "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; 
} 

답변

0

다음 JSON 응답은 3 뿌리가

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); 
+0

감사합니다. dtryon. 동적 유형이 트릭을하는 것 같습니다. 나는 당신의 힌트를 시험해 볼 것입니다. –