c# - studio - Formateo JsonMediaTypeFormatter con k__backingfield
serialize json to object c# (2)
Tengo un problema con el JsonMediaTypeFormatter
que, por lo que yo sé, comenzó a suceder hace muy poco.
En algún momento, el objeto que tengo (un viejo simple normal) comenzó a serializarse completo como campos de respaldo. Estoy usando propiedades automáticas (de nuevo solo un poco) pero por alguna razón la salida de JsonMediaTypeFormatter
es k__backingfield<propname>:"value"
En las últimas semanas nos hemos actualizado a visual studio 2015 (aunque dudo que sea la causa del problema, ya que esto ha estado funcionando durante algunas semanas antes).
He borrado todas las formas de nuget caches, eliminado todos los directorios bin / obj .... desinstalé y volví a instalar visual studio 2015 professional ... repaired visual studio 2015 professional .... Este código no ha cambiado en algún momento.
Estamos utilizando la versión 5.2.0
de System.Net.Http.Formatting
.
Gracias por cualquier ayuda.
Solo una actualización rápida ... esto no está sucediendo en la máquina de nadie más. No estoy experimentando ningún error (que estoy notando). Voy a agregar algunas etiquetas relacionadas con visual studio 2015 a esto también
Ok otra actualización rápida. He enviado un script de LinqPad, así como los ensamblados necesarios para ejecutar ese script a un compañero de trabajo. Las asambleas que estoy enviando son las exactas que he sacado de nuget y compiladas en mi máquina. Cuando ejecuta el código, se serializa como se desee. Mi máquina (y ahora la máquina de otro compañero de trabajo) todavía experimentan el problema.
Continúo aislando esto tanto como sea posible, pero cualquier otra guía sería muy apreciada
Puedo JsonMediaTypeFormatter.UseDataContractJsonSerializer
este problema convirtiendo la propiedad JsonMediaTypeFormatter.UseDataContractJsonSerializer
en true
. Investigo más sobre por qué funciona esto y por qué querría o no quiero hacer esto ... Tendré que hacer algunas pruebas más por la mañana con compañeros de trabajo que no tienen este problema. No me gusta la idea de un cambio de código que solucione algo que se comporte de manera impredecible.
¡DE ACUERDO! Una actualización más Hasta ahora, las máquinas afectadas han instalado recientemente Active Reports 10. Estamos realizando más pruebas y vamos a instalar informes activos 10 en una máquina que actualmente no está afectada para ver si ese es el culpable. Agregar una etiqueta para Informes Activos. Abriré un error con ellos si esto termina siendo cierto.
¿Están sus POCO marcadas con un atributo [Serializable]
? Si es así, esta puede ser la causa del problema.
Web API aparentemente viene con un JSON.Net DefaultContractResolver
que está configurado con IgnoreSerializableAttribute = false
. Uno de los efectos de esta configuración es que los nombres de las propiedades automáticas se serializarán en el formato <PropertyName>k__BackingField
donde PropertyName
se reemplaza por el nombre real de la propiedad.
Para solucionar esto, puede eliminar el atributo [Serializable]
de sus clases, o puede reemplazar el resolutor IgnoreSerializableAttribute = true
uno nuevo que tenga IgnoreSerializableAttribute = true
. Para hacer esto último, agregue lo siguiente al método Application_Start
en su Global.asax
:
var resolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
resolver.IgnoreSerializableAttribute = true;
var config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = resolver;
Aquí hay un violín que demuestra el concepto (aunque es una aplicación de consola, no una API web): https://dotnetfiddle.net/Bu6lgy
De acuerdo. La instalación de Active Reports 10 agrega Newtonsoft.Json
al GAC. Eliminar este ensamblaje del GAC ha resuelto este problema. Publicaré un error con informes activos.