2013-05-02 8 views
7

Diciamo che ho questi entitites con queste relazioni: Questo è solo un esempio fittizio, e non le mie entità attuali.Impostare una profondità massima della serializzazione JSON in .NET Web API

  • Corso
  • utente
  • NewsPosts

Corsi hanno molti utenti, Gli utenti hanno molti campi

Corsi ha molte NewsPosts, NewsPosts ha molte Corsi

utenti ha molti NewsPost, NewsPost ha molti utenti

Sto utilizzando il codice di Entity Framework prima con .NET Web API, che rimanda le entità sotto forma di JSON. Quando provo a ottenere un corso, restituisce un risultato JSON con le relazioni delle entiti, che va bene, ma vorrei impostare un limite di quanti livelli si serializza in modo che non serializzi tutte le relazioni oltre la prima o secondo livello.

GET Corso/sarebbe serializzato a:

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

    } 

quello che vorrei è quello di serializzare solo 1 o forse 2 livelli, in modo che il risultato sarebbe:

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

    } 

ho aggiunto a:

json.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 

Questo serve per rimuovere il riferimento.

Quindi, in breve: esiste un modo per impostare la quantità massima di nodi da serializzare?

+2

possibile duplicato di [Come serializzare o deserializzare un oggetto JSON in una certa profondità in C#?] (Http: // stackoverflow.it/questions/10453127/how-to-serialize-o-deserialize-a-json-object-to-a-certain-depth-in-c) –

+1

Un JSWriter personalizzato e un ContractResolver personalizzato sembrano la soluzione giusta. Grazie per aver notato il duplicato. –

risposta

0

Non è semplicemente una questione di come si costruiscono i dati da inviare dalla funzione get?

Voglio dire che il serializzatore JSON fa il suo lavoro serializzando tutti i dati che gli hai dato, semplicemente rimuovi i dati, o non li includono, e non verrà serializzato.

Se la sintonia migliore è la ricerca di un JsonWriter personalizzato è quello che vuoi, il link pubblicato da Alex Filipovici fornisce buoni dettagli su cosa fare per raggiungere questo obiettivo.

-1

Si consiglia di mappare le classi di dominio su oggetti DTO personalizzati utilizzando qualcosa come AutoMapper e quindi passare quelli per la serializzazione.

+0

Non è una buona pratica raccomandare qualcosa senza fare una domanda. Per esempio. potrebbe essere lì json verrà utilizzato per l'utilizzo in contesti generici: come la gestione dello stato, la memorizzazione nella cache, la registrazione ... –

-1

Non ho molta familiarità con le API Web, ma sembra che tu voglia creare un MediaTypeFormatter personalizzato che utilizzi JavaScriptSerializer, che ha una proprietà per impostare un limite di ricorsione.

MSDN - JavaScriptSerializer.RecursionLimit Property

Un'altra opzione è quella di fare una formattazione personalizzata che utilizza JSON.NET che ha lo stesso tipo di opzioni.

+0

Sì. Comunque, voglio comunque usare JSON.NET. Sembra che ci siano più funzionalità su json.NET di javascriptserializer. Quindi sì, sembra che voglio andare per l'altra opzione! Trovato un confronto qui: http://json.codeplex.com/ –

+0

JavaScriptSerializer.RecursionLimit non funziona per questo. JavaScriptSerializer genererà un'eccezione nel caso in cui il limite sia stato raggiunto. –

Problemi correlati