2013-05-24 16 views
5

Korzystam z MVC/Web API z MVC 4.5, aby obsługiwać usługę JSON.Jak zatrzymać serializację .net JSON, odwołując się do poprzednich elementów?

Wszystko działa dobrze, dopóki nie zostanie wyświetlony duży wynik JSON, który zawiera określone ilości powtarzających się danych.

Dla tych, którzy nie są pewni, co mam na myśli, jeśli na przykład mam listę książek, z których każda ma pełne dane autora, .net zmieni drugą wersję tego samego autora, aby odwołać się do poprzedniego, zamiast duplikowania danych. W takich przypadkach używa odwołania $ X, gdzie X jest indeksem elementu do odniesienia.

Choć doceniam Jego oszczędność efektywności, format ten nie może być spożywany przez klienta aplikacje

Odpowiedz

3

Json.NET ma ustawienie, które mogłyby to zrobić magii ... To konserwujące Odniesienia obiektu i tu jest link do documentation:

powiedziałbym, że to, czego doświadczamy, jest podobny do exmple w doucmentation

Niektóre ekstrakt(ale, proszę zobaczyć th Dokumenty po więcej szczegółów):

Załóżmy, że mamy do czynienia z osobą, która ma dwie osoby. Z małą sztuczkę: Ustawienie PreserveReferencesHandling jak ten

string json = JsonConvert.SerializeObject(
    people, 
    Formatting.Indented, 
    new JsonSerializerSettings 
    { 
    PreserveReferencesHandling = PreserveReferencesHandling.Objects 
    }); 

możemy uzyskać wynik tak:

[ 
    { 
    "$id": "1", 
    "Name": "James", 
    "BirthDate": "1983-03-08T00:00Z", 
    "LastModified": "2012-03-21T05:40Z" 
    }, 
    { 
    "$ref": "1" 
    } 
] 

co widzimy, jest najprawdopodobniej co robisz doświadczenia. Tak więc PreserveReferencesHandling.Objects wydaje się być ustawieniem twojego kodu. Więc spróbuj jawnie ustawić go Żaden tak:

new JsonSerializerSettings 
{ 
    PreserveReferencesHandling = PreserveReferencesHandling.None; 
} 

I jak w docs:

... Domyślnie Json.NET będzie szeregować wszystkie obiekty, które napotyka przez wartości. Jeśli lista zawiera dwie referencje osoby i obie referencje wskazują na ten sam obiekt to JsonSerializer zapisze wszystkie nazwy i wartości dla każdego odwołania ...

Tak powinno to być ustawienie domyślne ponownie

Kolejna ciekawa lektura: Serializing Circular References

+0

+1 Nicea artykuł o referencje okrągłych. –

Powiązane problemy