이 JSON을 역 직렬화하려고합니다.
{
"39": {
"category": "Miscellaneous",
"country_whitelist": [],
"name": "domain.com",
"url_blacklist": [],
"country_blacklist": [],
"url_whitelist": [
"domain.com"
],
"deals": {
"425215": {
"status": "Ok",
"type": "",
"code": "CODE",
"end_date": "2014-03-01 04:00:00",
"title": "RandomTitle",
"url": "http://domain.com/foo",
"text": "Text Text Text",
"long_title": "Longer Text"
},
"425216": {
"status": "Ok",
"type": "",
"code": "CODE2",
"end_date": "2014-03-01 04:00:00",
"title": "RandomTitle2",
"url": "http://domain.com/bar",
"text": "Text Text Text",
"long_title": "Longer Text"
}
},
"88x31": "http://someimage/88x31.png",
"subcategory": "Other"
},
"40": {
"category": "Miscellaneous",
"country_whitelist": [],
"name": "domain.com",
"url_blacklist": [],
"country_blacklist": [],
"url_whitelist": [
"domain.com"
],
"products": {
"425215": {
"status": "Ok",
"type": "",
"code": "CODE",
"end_date": "2014-03-01 04:00:00",
"title": "RandomTitle",
"url": "http://domain.com/foo",
"text": "Text Text Text",
"long_title": "Longer Text"
},
"425216": {
"status": "Ok",
"type": "",
"code": "CODE2",
"end_date": "2014-03-01 04:00:00",
"title": "RandomTitle2",
"url": "http://domain.com/bar",
"text": "Text Text Text",
"long_title": "Longer Text"
}
},
"88x31": "http://someimage/88x31.png",
"subcategory": "Other"
}
}
Json.NET을 사용해 보았고 ServiceStack의 deserializer를 사용해 보았지만이 JSON에 대한 어떤 유형의 표현도 얻을 수없는 것 같습니다.
나를 막는 가장 중요한 것은 키가 Int이지만 수신하는 JSON을 제어 할 수 없다는 것입니다.
이것은 내가 만든 C # 클래스입니다.
public class product
{
public string status { get; set; }
public string type { get; set; }
public string code { get; set; }
public string end_date { get; set; }
public string title { get; set; }
public string url { get; set; }
public string text { get; set; }
public string long_title { get; set; }
}
public class Merchant
{
public string category { get; set; }
public List<string> country_whitelist { get; set; }
public string name { get; set; }
public List<string> url_blacklist { get; set; }
public List<string> country_blacklist { get; set; }
public List<string> url_whitelist { get; set; }
public List<product> products { get; set; }
public string subcategory { get; set; }
}
public class Data
{
public Dictionary<int, Merchant> MainMerchants { get; set; }
}
ServiceStack을 사용하는 것을 선호하지만 작동하는 다른 deserializer가 좋습니다.
var data = client.Get (json);
JSON을 역 직렬화 할 수 있습니다. 올바르게 식별했으면 Dictionary<int, Merchant>
.
그러나 당신은 당신의 정의를 변경해야합니다 products
에 Merchant
을 할 클래스 Dictionary<int, Product>
. 숫자 키를 처리하려면 여기에서 사전이어야합니다. List<Product>
작동하지 않습니다.
또한 88x31
속성 을 처리 하기 위해 DataMember(Name = '88x31')
매핑을 사용하여 image88x31
. 불행히도 이것은 DTO 속성이 옵트 인이됨을 의미하므로 모든 구성원을 장식해야합니다. 더하다using System.Runtime.Serialization;
다음과 같이 변경하면 :
// Note I capitalized Product
public class Product
{
public string status { get; set; }
public string type { get; set; }
public string code { get; set; }
public string end_date { get; set; }
public string title { get; set; }
public string url { get; set; }
public string text { get; set; }
public string long_title { get; set; }
}
/*
* Use DataMember to map the keys starting with numbers to an alternative c# compatible name.
* Unfortunately this requires properties to opt in to the data contract.
*/
[DataContract]
public class Merchant
{
[DataMember]
public string category { get; set; }
[DataMember]
public List<string> country_whitelist { get; set; }
[DataMember]
public string name { get; set; }
[DataMember]
public List<string> url_blacklist { get; set; }
[DataMember]
public List<string> country_blacklist { get; set; }
[DataMember]
public List<string> url_whitelist { get; set; }
[DataMember]
public Dictionary<int, Product> products { get; set; }
[DataMember]
public string sub_category { get; set; }
// This maps the 88x31 key to a c# appropriate name
[DataMember(Name = "88x31")]
public string image88x31 { get; set; }
}
그러면 Dictionary<int, Merchant>
문제없이 로 역 직렬화 할 수 있습니다.
JsonSerializer.DeserializeFromString<Dictionary<int, Merchant>>("YOUR JSON STRING");
이 요청을 ServiceStack 서비스에 직접 보낼 수 있도록하려면를 사용 RequestBinder
하여이 복합 유형으로 역 직렬화 할 수 있습니다 . 이 서비스에서 :
DTO 요청 :
[Route("/Merchants", "POST")]
public class MerchantsRequest
{
public Dictionary<int, Merchant> MainMerchants { get; set; }
}
간단한 조치 방법 :
public class MerchantsService : Service
{
public void Post(MerchantsRequest request)
{
var merchant39 = request.MainMerchants.First(p=>p.Key == 39).Value;
Console.WriteLine("Name: {0}\nImage: {1}\nProduct Count: {2}", merchant39.name, merchant39.image88x31, merchant39.products.Count);
var merchant40 = request.MainMerchants.First(p=>p.Key == 40).Value;
Console.WriteLine("Name: {0}\nImage: {1}\nProduct Count: {2}", merchant40.name, merchant40.image88x31, merchant40.products.Count);
}
}
AppHost 구성 :
당신에 AppHost
Configure
방법 당신은 요청 유형에 바인더를 추가해야합니다. 즉 typeof(MerchantsRequest)
:
public override void Configure(Funq.Container container)
{
Func<IRequest, object> merchantsRequestBinder = delegate(IRequest request) {
var json = WebUtility.HtmlDecode( request.GetRawBody() );
return new MerchantsRequest { MainMerchants = JsonSerializer.DeserializeFromString<Dictionary<int, Merchant>>(json) };
};
RequestBinders.Add(typeof(MerchantsRequest), merchantsRequestBinder);
...
}
이 바인더 메서드는 보내는 json을 MerchantsRequest
. 그런 다음 일반 ServiceStack 요청처럼 사용할 수 있습니다.
복잡한 JSON을 서비스 요청으로 변환하는 것을 보여주는 콘솔 애플리케이션의 완전 작동 예제입니다.
참고 : JSON deals
에서 한 개체에 속성이 있음을 확인 하고 다른 개체 products
에 대한 클래스에 해당 속성이 없기 때문에 오타라고 가정했습니다 deals
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다