2011-01-23 18 views
5

Hej ludzie, mam nadzieję, że wszyscy dobrze się zerwali podczas wakacji.Utwórz obiekt JSON zamiast tablicy za pomocą LINQ/JavaScriptSerializer

Utworzyłem usługę WebService, która zwraca listę miast i firm w tych miastach jako ciąg JSON przy użyciu LINQ/JavaScriptSerializer.

Mój kod jest grubsza

var data = from c in db.Companies 
      group c by c.City into cities 
      select new 
      { 
       city = cities.Key, 
       companies = from company in cities 
        select company.Name 
      }; 

JavaScriptSerializer jss = new JavaScriptSerializer(); 
return jss.Serialize(data); 

która produkuje następujące JSON ciąg

[ 
    {"city":"Auckland","companies":["Company1","Company2"]}, 
    {"city":"Wellington","companies":["Company3","Company4","Company5"]} 
] 

Jednakże chcę, aby miastu klucz, dzięki czemu można łatwo wyszukiwać według niego

Na przykład

[ 
    "Auckland" : {"companies":["Company1","Company2"]}, 
    "Wellington" : {"companies":["Company3","Company4","Company5"]} 
] 

Jakieś pomysły?

+0

Nie sądzę, że jest to poprawne JSON. Czy nie masz na myśli nawiasów klamrowych zamiast kwadratowych nawiasów? –

+0

Hej @Mark, czy odnosisz się do drugiego? Ręcznie napisałem, że przepraszam za błąd. – Marko

Odpowiedz

8

tylko pomysł ... spróbuj

var data = db.Companies 
      .GroupBy(c => c.City) 
      .ToDictionary(g => g.Key, 
          g => new { companies = g.Select(c => c.Name) }); 

Więc to zbuduje Dictionary<string, xxx> gdzie xxx jest anonimowy typ z pojedynczym własności „firmy”, która jest ciągiem nazw firm.

+0

Dziękuję Jon, otrzymuję wyjątek, chociaż "Błąd 2 Argument 3: nie można przekonwertować z 'AnonymousType # 1' na 'System.Collections.Generic.IEqualityComparer '' – Marko

+0

@Marko I * myślę * Widzę problem - spróbuj aktualizacji? (Jon - mam nadzieję, że nie masz nic przeciwko temu, że mnie hackujesz; p) –

+0

@Marc: Dzięki za to :) Zmontujemy ponownie tylko po to, aby pozbyć się paska przewijania ... –

Powiązane problemy