C #에서 int를 키로 사용하는 JSON 역 직렬화

Afiku

이 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>.

그러나 당신은 당신의 정의를 변경해야합니다 productsMerchant을 할 클래스 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 서비스에서 사용 :

이 요청을 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C #에서 JSON으로 직렬화하고 TS에서 역 직렬화

분류에서Dev

Java 및 Jersey에서 categoryID를 키로 사용하는 범주의 JSON 역 직렬화

분류에서Dev

C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

분류에서Dev

Newtonsoft.Json을 사용하여 C #에서 중첩 배열로 json을 역 직렬화하는 방법

분류에서Dev

C # 임의 키로 시작하는 Facebook JSON 역 직렬화

분류에서Dev

C #을 사용하여 Wikipedia API에서 JSON 역 직렬화

분류에서Dev

파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

분류에서Dev

.NET DataContractJsonSerializer serializer를 사용하여 사전으로 JSON 직렬화 / 역 직렬화

분류에서Dev

.NET DataContractJsonSerializer serializer를 사용하여 사전으로 JSON 직렬화 / 역 직렬화

분류에서Dev

C #에서 동적 및 정적 키 이름으로 JSON을 역 직렬화하는 방법

분류에서Dev

C #에서 테이블과 값으로 JSON을 역 직렬화하는 방법

분류에서Dev

동적 키를 사용하여 JSON을 사전으로 역 직렬화

분류에서Dev

C ++에서 템플릿 함수 직렬화 및 역 직렬화를 대칭 적으로 구현하는 방법

분류에서Dev

C #을 사용하여 클래스로 JSON 역 직렬화

분류에서Dev

C # JSON 내에서 JSON 역 직렬화

분류에서Dev

C #에서 Newtonsoft를 사용하여 Json에서 중첩 된 개체의 효율적인 수동 역 직렬화

분류에서Dev

JSON에서 /에서 중첩 된 파생 개체를 사용하여 C # 데이터 개체 역 직렬화

분류에서Dev

C #에서는 간단한 JSON 개체를 정수 목록으로 역 직렬화합니다.

분류에서Dev

C #에서 Newtonsoft를 사용하여 역 직렬화하는 방법

분류에서Dev

C #에서 JSON 배열을 역 직렬화하는 방법

분류에서Dev

C #에서 JSON을 역 직렬화하는 방법

분류에서Dev

Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

분류에서Dev

C #에서 Newtonsoft Json.NET을 사용하여 JSON 역 직렬화

분류에서Dev

C # 문자열로 시작하는 키 이름으로 JSON 역 직렬화

분류에서Dev

속성 이름에 $를 사용하여 JSON 역 직렬화

분류에서Dev

C #에서 Json 역 직렬화

분류에서Dev

C #에서 JSON 배열 역 직렬화

분류에서Dev

C #에서 JSON 개체 역 직렬화

분류에서Dev

JavaScriptSerializer를 사용하여 JSON을 튜플으로 역 직렬화하는 방법

Related 관련 기사

  1. 1

    C #에서 JSON으로 직렬화하고 TS에서 역 직렬화

  2. 2

    Java 및 Jersey에서 categoryID를 키로 사용하는 범주의 JSON 역 직렬화

  3. 3

    C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

  4. 4

    Newtonsoft.Json을 사용하여 C #에서 중첩 배열로 json을 역 직렬화하는 방법

  5. 5

    C # 임의 키로 시작하는 Facebook JSON 역 직렬화

  6. 6

    C #을 사용하여 Wikipedia API에서 JSON 역 직렬화

  7. 7

    파일에서 개체를 역 직렬화 및 재 직렬화하는 데 문제가있는 C # JSON.net

  8. 8

    .NET DataContractJsonSerializer serializer를 사용하여 사전으로 JSON 직렬화 / 역 직렬화

  9. 9

    .NET DataContractJsonSerializer serializer를 사용하여 사전으로 JSON 직렬화 / 역 직렬화

  10. 10

    C #에서 동적 및 정적 키 이름으로 JSON을 역 직렬화하는 방법

  11. 11

    C #에서 테이블과 값으로 JSON을 역 직렬화하는 방법

  12. 12

    동적 키를 사용하여 JSON을 사전으로 역 직렬화

  13. 13

    C ++에서 템플릿 함수 직렬화 및 역 직렬화를 대칭 적으로 구현하는 방법

  14. 14

    C #을 사용하여 클래스로 JSON 역 직렬화

  15. 15

    C # JSON 내에서 JSON 역 직렬화

  16. 16

    C #에서 Newtonsoft를 사용하여 Json에서 중첩 된 개체의 효율적인 수동 역 직렬화

  17. 17

    JSON에서 /에서 중첩 된 파생 개체를 사용하여 C # 데이터 개체 역 직렬화

  18. 18

    C #에서는 간단한 JSON 개체를 정수 목록으로 역 직렬화합니다.

  19. 19

    C #에서 Newtonsoft를 사용하여 역 직렬화하는 방법

  20. 20

    C #에서 JSON 배열을 역 직렬화하는 방법

  21. 21

    C #에서 JSON을 역 직렬화하는 방법

  22. 22

    Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

  23. 23

    C #에서 Newtonsoft Json.NET을 사용하여 JSON 역 직렬화

  24. 24

    C # 문자열로 시작하는 키 이름으로 JSON 역 직렬화

  25. 25

    속성 이름에 $를 사용하여 JSON 역 직렬화

  26. 26

    C #에서 Json 역 직렬화

  27. 27

    C #에서 JSON 배열 역 직렬화

  28. 28

    C #에서 JSON 개체 역 직렬화

  29. 29

    JavaScriptSerializer를 사용하여 JSON을 튜플으로 역 직렬화하는 방법

뜨겁다태그

보관