2016-06-24 2 views
1

에서 json을 받았습니다. json 매핑에 대한 클래스 속성 선언이 잘못되었습니다.

{ 
    "items": [{ 
    "delivery-status": { 
     "message": null, 
     "code": 605, 
     "description": "Not delivering to previously bounced address", 
     "session-seconds": 0 
    }, 
    "event": "failed", 
    "log-level": "error", 
    "recipient": "[email protected]" 
    }, 
    { 
     //some other properties of above types 
    }] 
} 

는 지금은 deserializing 후 위의 json 속성을 자동 매핑을위한 클래스 구조를 만들려고했다.
public class test 
{ 
    public List<Item> items { get; set; } 
} 
public class Item 
{ 
    public string recipient { get; set; } 
    public string @event { get; set; } 
    public DeliveryStatus delivery_status { get; set; } 
} 

public class DeliveryStatus 
{ 
    public string description { get; set; } 
} 

내가 deserialize하고 속성을 매핑 할 방법이다.
var resp = client.Execute(request); 
var json = new JavaScriptSerializer(); 
var content = json.Deserialize<Dictionary<string, object>>(resp.Content); 
test testContent = (test)json.Deserialize(resp.Content, typeof(test)); 
var eventType = testContent.items[0][email protected]; 
var desc = testContent.items[0].delivery_status.description; //stays null 

지금 위의 클래스에 Item, recipient@event가 제대로 매핑됩니다과는 keyword 때부터 @ 문자를 앞에 사용하는 가정하고 그것을 잘 작동합니다. 그러나 jsondelivery-status 속성은 class DeliveryStatusdelevery_status 속성으로 매핑되지 않습니다. 나는 그것을 deliveryStatus 또는 @deliver-status으로 만들어 보았습니다. 이전의 on은 다시 맵핑되지 않으며 나중에는 컴파일 타임 예외가 발생합니다. 어쨌든 - 사이에 속성을 선언하는 것과 같이 처리 할 수있는 것이 있습니까? 내 끝에서 생성되지 않기 때문에 response json을 변경할 수 없습니다. 도움이되기를 바랍니다.

업데이트

this answer을 참조하여 다음과 같이 클래스를 변경하지만, 도움이되지 않았다. 그것의 null 다시.

public class Item 
{ 
    public string @event { get; set; } 

    [JsonProperty(PropertyName = "delivery-status")] 
    public DeliveryStatus deliveryStatus { get; set; } 
} 
+0

기본 'JavaScriptSerializer' 옵션 대신'Json.NET' (이것을 처리 할 수 ​​있습니다)을 사용하고 있습니까? –

+0

'DeliveryStatus' 클래스에는 하나가 아닌 몇 가지 속성 만 있습니다. 메시지, 코드, 설명, 세션 초. –

+0

예 @StephenMuecke ..'Json.NET'으로 어떻게 달성 할 수 있는지 알려주세요. –

답변

2

나는 문제가 당신의 끝에 무엇인지 잘 모르겠지만,이 코드를 사용하는 경우 적어도 작동합니다. 프로젝트에 Newtonsoft.Json의 최신 버전을 포함시켜야합니다.

public class DeliveryStatus 
{ 
    public object message { get; set; } 
    public int code { get; set; } 
    public string description { get; set; } 
    [JsonProperty("session-seconds")] 
    public int session_seconds { get; set; } 
} 

public class Item 
{ 
    [JsonProperty("delivery-status")] 
    public DeliveryStatus delivery_status { get; set; } 
    public string @event { get; set; } 
    [JsonProperty("log-level")] 
    public string log_level { get; set; } 
    public string recipient { get; set; } 
} 

public class RootObject 
{ 
    public List<Item> items { get; set; } 
} 

public static void Main(string[] args) 
{ 
     string json = @"{ 
    ""items"": [{ 
    ""delivery-status"": { 
       ""message"": null, 
     ""code"": 605, 
     ""description"": ""Not delivering to previously bounced address"", 
     ""session-seconds"": 0 
    }, 
    ""event"": ""failed"", 
    ""log-level"": ""error"", 
    ""recipient"": ""[email protected]"" 
    }] 
}"; 

    RootObject r = JsonConvert.DeserializeObject<RootObject>(json); 
} 
+0

내가 잘못 무엇인지 모르겠지만, 나는이 줄을'변경 (테스트) json.Deserialize (resp.Content의 typeof (테스트));'시험 연구'에 = JsonConvert.DeserializeObject (resp.Content); ' 그리고 이제는 작동합니다 .. 기본적으로'json.Deserialize'로 'deserialization'이 제대로 수행되지 않았습니다. –

+0

난 당신이 JSON.NET의'JsonProperty' 속성과 마이크로 소프트의'JavaScriptSerializer'을 혼합하려고했던 것 같아요. 그것은 작동하지 않습니다. –

+0

네 .. 그게 문제가 될 수 있어요 .. 어쨌든 .. 니스 많이 .. 감사 솔루션을 알고 당신이 @StephenMuecke ... 마지막으로 그 해결에 감사 .. :) –

관련 문제