2017-03-23 4 views
0

의미 상 사전 인 리소스를 가져 오기 위해 REST API 용 DTO를 설계하는 가장 좋은 방법은 무엇입니까?C# REST 사전 DTO

예 : 연령별 직원 수를 구하십시오. -> 유형 (int, int)의 쌍 (연령, 숫자)을 반환해야합니다.

하는 쉬운 방법은 같은 구조의 배열한다 :

[ 
    { 
     age: 30, 
     number: 3 
    }, 
    { 
     age: 31, 
     number: 4 
    }, 
    { 
     age: 32, 
     number: 5 
    } 
] 

하지만이 키가 고유해야한다는 강제하지 않습니다. 쉽게 직렬화/역 직렬화 될 수 있도록, C#에서 이러한 DTO를 정의하는 방법이 있나요

{ 
    "30": 3, 
    "31": 4, 
    "32": 5 
} 

: 는 의미 적, 차라리 같은 사전을 선호하는 것?

답변

3

귀하의 Json이 유효하지 않습니다 둘째,은 다음과 같은 모양입니다 :

{ 
    "30": 3, 
    "31": 4, 
    "32": 5 
} 

그리고 c#에 그것은 단지 Dictionary<string, int>

당신은/역 직렬화를 easiliy Json.Net

var result =JsonConvert.DeserializeObject<Dictionary<string, int>>(text); 

var serialized = JsonConvert.SerializeObject(
      new Dictionary<string, int> { { "1", 2 }, {"3",4}}); 
+0

필요가 없습니다 : 그런 다음

 DynamicDictionary dynamicDictionary = ToDynamicDictionary(dictionary); return this .Negotiate .WithModel(dynamicDictionary) .WithStatusCode(HttpStatusCode.OK); 

을,이 도우미 메서드를 사용하여 문자열로 열쇠를 변환해야 문자열을 키 : http://stackoverflow.com/a/42982286/1288109 참조하십시오. –

+0

@Starnutoditopo 샘플에 문자열 키가 있습니다. int-int dictioniary 일 수 있습니다. 그러나 json에서는 문자열 키와 int 값이 있습니다. –

+0

이것은 Json 구문입니다. 따옴표 붙이지 않은 숫자 키는 사용할 수 없습니다! 숫자 키는 반드시 인용해야합니다! json 사양을보십시오! 어쨌든 Json.Net은 따옴표로 일련 번호를 매 깁니다. http://stackoverflow.com/a/42982286/1288109에서 제안한 예제를 사용해보십시오. –

0

으로 직렬화 수 maksim-simkin에서 제안한 것처럼 his answer에 사전이 기본적으로 지원됩니다. 편집자 : Json.Net. 유용하게 사용될 수있는 경우

var result = JsonConvert.DeserializeObject<Dictionary<int, int>>(text); 

var serialized = JsonConvert.SerializeObject(new Dictionary<int, int> { { 30, 3 }, { 31, 4}}); 

// here serialized == "{\"30\":3,\"31\":4,\"32\":5}" 
0

이 직렬화 (네임 스페이스 낸시 단위) DynamicDictionary 클래스를 통해 Nancy에서 지원됩니다

다음은 예입니다. NancyModule에서이 같은 모델을 만들 수의 변환을 수행 할 수

private static DynamicDictionary ToDynamicDictionary(IDictionary<int, int> dictionary) 
    { 
     DynamicDictionary result = new DynamicDictionary(); 
     foreach (var pair in dictionary) 
     { 
      result.Add(pair.Key.ToString(CultureInfo.InvariantCulture), pair.Value); 
     } 

     return result; 
    }