2013-05-02 21 views
7

Załóżmy, że mam te uprawnienia z tymi relacjami: To tylko fikcyjny przykład, a nie moje obecne byty.Ustaw maksymalną głębokość serializacji JSON w .NET Web API

  • Kurs
  • użytkownika
  • Newsów

Kursy mają wielu użytkowników, Użytkownicy mają wiele pól

Kurs ma wiele Newsów, Newsów ma wiele pól

Użytkownicy ma wiele NewsPosts, NewsPosts ma wielu użytkowników

Najpierw używam kodu Entity Framework z .NET Web API, który odsyła obiekty w formie JSON. Kiedy próbuję uzyskać kurs, wysyła on wynik JSON z relacjami z obiektu, co jest w porządku, ale chciałbym ustawić limit liczby poziomów, które serializuje, tak aby nie serializować wszystkich relacji poza pierwszym lub drugi poziom.

GET przedmiotów/będzie w odcinkach do:

{ 
    "Users":[{ 
       "id":1, 
       "newsPosts": [{ 
           "id":1, 
           "message":"foo" 
          }] 
      }], 
    "newsPosts":[{ 
       "id":2, 
       "message":"bar" 
       }] 

    } 

Co ja chciałbym to do serializacji tylko 1, góra 2 poziomy, tak że wynik będzie:

{ 
    "Users":[{ 
       "id":1, 
       "newsPosts": [] 
      }], 
    "newsPosts":[{ 
       "id":2, 
       "message":"bar" 
       }] 

    } 

Dodałem a:

json.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 

Służy to do usunięcia listowania referencji.

Krótko mówiąc: czy istnieje sposób ustawienia maksymalnej liczby węzłów do serializacji?

+2

możliwy duplikat [Jak serializować lub deserializować obiekt JSON do pewnej głębokości w C#?] (Http: // stackoverflow.com/questions/10453127/how-to-serialize-lub-deserialize-a-json-object-to-a-depth-in-c) –

+1

Niestandardowy JsonWriter i niestandardowy ContractResolver wydaje się być drogą do zrobienia. Dzięki, że zauważyłeś duplikat. –

Odpowiedz

0

Czy nie jest to po prostu kwestia sposobu konstruowania danych do wysłania z funkcji get?

Chodzi mi o to, że serializator JSON wykonuje swoją pracę, serializując wszystkie dane, które mu dasz, po prostu usuwając dane lub nie dołączając go, i nie będzie serializowany.

Jeśli szukasz lepszego dopasowania, JsonWriter jest tym, czego potrzebujesz, link opublikowany przez Alex Filipovici zawiera szczegółowe informacje na temat tego, co należy zrobić, aby to osiągnąć.

-1

Polecam odwzorowanie klas (-ek) twojej domeny na niestandardowe obiekty DTO za pomocą obiektów takich jak AutoMapper, a następnie przekazanie ich do serializacji.

+0

Nie jest dobrą praktyką zalecanie czegoś bez zadawania pytania. Na przykład. być może json będzie używany do używania w ogólnych kontekstach: jak obsługa stanów, buforowanie, rejestrowanie ... –

-1

Nie jestem obeznany z Web API, ale wydaje się, że będziesz chciał stworzyć niestandardowy MediaTypeFormatter, który używa JavaScriptSerializer, który ma właściwość do ustawienia limitu rekursji.

MSDN - JavaScriptSerializer.RecursionLimit Property

Inną opcją jest stworzenie niestandardowego formatowania, który używa Json.NET, który ma ten sam rodzaj opcji.

+0

Tak. Nadal jednak chcesz używać JSON.NET. Wydaje się, że na json.NET jest więcej funkcji niż javascriptserializer. Tak tak, wydaje się, że chcę iść na inną opcję! Znaleziono porównanie tutaj: http://json.codeplex.com/ –

+0

JavaScriptSerializer.RecursionLimit nie działa na to. JavaScriptSerializer rzuci wyjątek w przypadku osiągnięcia limitu. –

Powiązane problemy