2012-08-17 14 views
6

Sto provando a serializzare oggetti come JSON con MVC4 WebAPI (RTM - ho appena installato VS2012 RTM oggi ma ho riscontrato questo problema ieri nella RC) e mi piacerebbe per tutti i null da rendere nell'output JSON. Ti piace questa:Impossibile rendere MVC4 WebApi include campi null in JSON

[{"Id": 1, "PropertyThatMightBeNull": null},{"Id":2, "PropertyThatMightBeNull": null}] 

Ma che cosa Im ottenendo è

[{"Id":1},{"Id":2}] 

ho trovato questo Q/A WebApi doesnt serialize null fields ma la risposta o non funziona per me o mi sto riuscendo a cogliere in cui per mettere la risposta.

Ecco che cosa ho provato:

  1. In Application_Start di Global.asax.cs, ho aggiunto:

    var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
    json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include; 
    json.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include; 
    

    Ciò non (sembra) di errore e sembra eseguire effettivamente basato sul guardare alla prossima cosa che ho provato.

  2. In un metodo di controllo (in una sottoclasse di ApiController), aggiunto:

    base.Configuration.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include; 
    base.Configuration.Formatters.JsonFormatter.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include; 
    

    dico # 1 eseguita perché entrambi i valori in # 2 sono stati già fissati prima quelle linee correvano come ho intensificato attraverso.

  3. Con una mossa disperata (perché io davvero non voglio per decorare ogni proprietà di ogni oggetto) ho provato ad aggiungere questo attrib per una proprietà che era nullo e assente:

    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include, 
        NullValueHandling = NullValueHandling.Include)] 
    

Tutto tre producono lo stesso JSON con proprietà nulle omesse.

Note aggiuntive:

  • in corso a livello locale in IIS (provato costruito in troppo), Windows 7, VS2012 RTM.
  • metodi controller restituiscono List - ha cercato IEnumerable troppo
  • Gli oggetti che sto cercando di serializzare sono pocos.

risposta

1

ho finalmente sono imbattuto in questo http://forums.asp.net/t/1824580.aspx/1?Serializing+to+JSON+Nullable+Date+gets+ommitted+using+Json+NET+and+Web+API+despite+specifying+NullValueHandling che descrive quello che stavo vivendo come un bug nella beta che era risolto per RTM.

Anche se avevo installato VS2012 RTM, il mio progetto utilizzava ancora tutti i pacchetti di nuget con cui la beta veniva. Quindi ho aggiornato (nugot?) Gli aggiornamenti per tutto e ora tutto va bene (usando il n. 1 della mia domanda). Anche se mi sento sciocco per aver bruciato mezza giornata.

10

Questo non funziona:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include; 

ma questo:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() 
{ 
NullValueHandling = Newtonsoft.Json.NullValueHandling.Include 
}; 
+0

scopre che ha fatto il lavoro - o dovrebbe avere. Pubblicherò quello che stavo rovinando per darmi una dose piena di umiltà :) – AndrewFreese

+0

Non posso ringraziarti abbastanza per questa risposta. – Simian

+0

La prima variante funziona anche (senza creare una nuova istanza delle impostazioni del serializzatore), purché sia ​​DefaultValueHandling AND NullValueHandling ai rispettivi rispettivi valori Includi – Masterfu

0

Quando ho visto questa risposta ero arrabbiato perché stavo già facendo questo e ancora il mio problema esisteva ancora.Il mio problema riguardava il fatto che il mio oggetto implementava un'interfaccia che includeva un tipo nullable, quindi, avevo un contratto che diceva se vuoi implementare me devi avere uno di questi, e un serializzatore che dice se uno di questi è nullo non includerlo. BOOM!

2

Per qualche strana ragione, Newtonsoft.Json.JsonFormatter ignora le assegnazioni alle propretie os SerializerSettings.

Al fine di rendere il vostro lavoro impostazione creare nuova istanza di .SerializerSettings come illustrato di seguito:

config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings 
     { 

      DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include, 
      NullValueHandling = Newtonsoft.Json.NullValueHandling.Include, 

     }; 
+0

Ciò funziona anche senza creare una nuova istanza delle impostazioni del serializzatore, purché sia ​​impostato entrambi DefaultValueHandling e NullValueHandling ai rispettivi rispettivi valori Include – Masterfu

+0

L'istanziazione di una nuova istanza delle impostazioni del serializzatore era necessaria per risolvere questo problema per noi su macchine di sviluppo e di gestione temporanea. Questo è stato un problema frustrante perché le nostre macchine di sviluppo funzionavano come previsto semplicemente impostando i rispettivi valori (con versioni .NET, json serializzatore apparentemente uguali.) –