2012-08-17 17 views
6

Estoy tratando de serializar objetos como JSON con MVC4 WebAPI (RTM - acaba de instalar VS2012 RTM hoy pero estaba teniendo este problema ayer en el RC) y me gustaría todos los nulos que se representarán en la salida JSON. De esta manera:No puedo hacer MVC4 WebApi incluir campos nulos en JSON

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

Pero lo que estoy recibiendo es

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

he encontrado este Q/A WebApi doesnt serialize null fields pero la respuesta sea no funciona para mí o estoy no comprender donde para poner la respuesta.

Aquí es lo que he intentado:

  1. En Application_Start de Global.asax.cs, añadí:

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

    esto no (parece que) el error y parece para ejecutar realidad basado en mirar lo siguiente que intenté

  2. En un método de controlador (en una subclase de ApiController), añadido:

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

    digo # 1 ejecutada porque ambos valores en # 2 ya se habían establecido antes de que esas líneas corrieron como entré a través.

  3. En un movimiento desesperado (porque realmente no quiero para decorar todas las propiedades de cada objeto) He intentado añadir el atrib a una propiedad que era nula y ausente:

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

Todos tres producen el mismo JSON con propiedades nulas omitidas.

Notas adicionales:

  • que se ejecutan localmente en IIS (intentaron construida en demasiado), Windows 7 RTM VS2012.
  • Métodos del controlador regresan Lista - intentado IEnumerable también
  • Los objetos que intento serializar son pocos.

Respuesta

1

finalmente me encontré con este http://forums.asp.net/t/1824580.aspx/1?Serializing+to+JSON+Nullable+Date+gets+ommitted+using+Json+NET+and+Web+API+despite+specifying+NullValueHandling que describe lo que estaba experimentando como un error en la versión beta que era arreglado para el RTM.

Aunque había instalado VS2012 RTM, mi proyecto aún usaba todos los paquetes nuget de los que venía la versión beta. Así que me nugetted (nugot?) Actualizaciones para todo y ahora todo está bien (utilizando el n. ° 1 de mi pregunta). Aunque me siento tonto por haberme quemado medio día.

10

Esto no funcionará:

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

pero esto:

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

Resulta que lo hizo el trabajo - o debería tener. Voy a publicar lo que estaba jodiendo para darme una dosis completa de humildad :) – AndrewFreese

+0

No puedo agradecerles lo suficiente por esta respuesta. – Simian

+0

La primera variante también funciona (sin crear una nueva instancia de configuración de serializador), siempre que establezca DefaultValueHandling AND NullValueHandling en sus respectivos valores de inclusión – Masterfu

0

Cuando vi esta respuesta, estaba molesto porque ya estaba haciendo esto y, sin embargo, mi problema aún existía.Mi problema se remontaba al hecho de que mi objeto implementaba una interfaz que incluía un tipo anulable, por lo tanto, tenía un contrato que decía que si desea implementarme, debe tener uno de estos, y un serializador que dice que uno de ellos es nulo. no incluirlo ¡AUGE!

2

Por alguna extraña razón, el Newtonsoft.Json.JsonFormatter ignora las asignaciones a las proporidades os SerializerSettings.

Con el fin de hacer su trabajo de establecimiento de crear nueva instancia de .SerializerSettings como se muestra a continuación:

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

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

     }; 
+0

Esto también funciona sin crear una nueva instancia de configuración de serializador, siempre que establezca ambos DefaultValueHandling y NullValueHandling a sus respectivos valores de inclusión – Masterfu

+0

Se requiere la instanciación de una nueva instancia de la configuración del serializador para resolver este problema en máquinas de desarrollo y estadificación. Esto fue un problema frustrante porque nuestras máquinas de desarrollo funcionaban como se esperaba simplemente configurando los valores respectivos (con versiones de serializador jSON iguales a .NET). –

Cuestiones relacionadas