2014-11-13 15 views
6

mam sekwencję par klucz/wartość z niestandardowym zamówieniu (nie przez klucz), że chcę wrócić:Jak zwrócić posortowaną słownika z ASP.NET Web API

public IHttpActionResult GetStuff() { 
    bla-bla-bla 
    .ToDictionary(x => x.Code, x => x.Desc); 
} 

produkuje następujące JSON:

Odpowiedź jest zawsze sortowana za pomocą klucza, ponieważ jak rozumiem, Dictionary<K, T> nie gwarantuje konkretnego zamówienia. Gdybym zamiast zwróci listę sortowanych KeyValuePair<K, T> Web API produkuje inny układ:

[ 
    { "Key": 3, "Value": "AAA"}, 
    { "Key": 8, "Value": "CCC"}, 
    { "Key": 1, "Value": "ZZZ"}, 
] 

który nie chce z powodu dodatkowego ładunku. Jak więc zwrócić podobną do słownika sekwencję klucz/wartość sformatowaną jak w pierwszym przykładzie?

Odpowiedz

2

Możesz użyć metody Select(), aby zmienić wyjście ze swojego słownika na specifique ViewModel. Dla próbki:

public class SourceViewModel 
{ 
    public string Key { get; set; } 
    public string Value { get; set; } 
} 

też przydałby Ok sposób reagować kod stanu 200 HTTP, dla próbki:

public IHttpActionResult GetStuff() 
{ 
    return Ok(source.Select(x => new SourceViewModel { Key = x.Code, Value = x => x.Desc}) 
        .ToList()); 
} 
+0

Czy to nieudokumentowana konwencja? Mam na myśli anonimowe obiekty o własnościach 'Key' /' Value'? Chociaż działa to w przypadku serializatora JSON.NET, nie dotyczy XML (podczas korzystania z negocjacji treści): 'InvalidOperationException' Typ ... AnonymousType4'2 ... nie może być serializowany. – UserControl

+0

Zrobiłem kilka zmian. Możesz użyć ViewModel, aby dokonać serializacji. –

1

Należy wykorzystać drugą formatu takiego (z przykładu):

[ 
    { "Key": 3, "Value": "AAA"}, 
    { "Key": 8, "Value": "CCC"}, 
    { "Key": 1, "Value": "ZZZ"}, 
] 

Powodem jest to, że słowniki JSON nie mają nawet pojęcia sortowania, to tak, jakby poprosić samochód o żeglowanie po wodzie w taki sposób, że byłoby to nienaturalne. Możesz pomyśleć: "ale wszystko, czego potrzebuję, to dostać je we właściwej kolejności, zanim je wyślę", ale klient nie będzie mógł zobaczyć żadnego zamówienia.

Powyższy przykład umieszcza elementy w tablicy, a nie w słowniku, a tablice mają kolejność, ponieważ są listą. Nie powinieneś martwić się o dodatkowy rozmiar, ponieważ jest to już bardzo skuteczne.

Innym podejściem byłoby oczekiwanie od klienta sortowania danych w oparciu o odczyt wszystkich pól kluczowych, ale to naprawdę nie jest grzeczny sposób przesyłania ogólnie zamówionych danych.