2017-03-23 3 views
0

意味的に辞書であるリソースを取得するためにREST APIのDTOを設計する最良の方法は何ですか?C#REST dictionary DTO

例:年齢別従業員数を取得する - >型(int、int)の組み合わせ(年齢、数)を返す必要があります。

簡単な方法は次のように、構造体の配列でなければなりません:

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

が、これはキーが一意であることを強制しません。

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

デシリアライズ/簡単にシリアル化できるように、C#で、このようなDTOを定義する方法があります: 意味的に、私はむしろのように、辞書を好むだろうか?

答えて

3

Jsonが有効でないあなた、それは次のようになります。

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

そしてc#で、それはあなたがデシリアライズ/ 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

でそれをシリアル化easiliy可能性だけDictionary<string, int>

です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; 
    }