servicio - Deserialización de propiedad automática de C#de JSON
serializar y deserializar json c# (4)
Necesito deserializar algún objeto JavaScript representado en JSON en una clase C # apropiada. Dadas las buenas características de las propiedades automáticas, preferiría tenerlas en estas clases en lugar de solo tener campos. Desafortunadamente, el motor de serialización .NET (al menos, por defecto) ignora por completo las propiedades automáticas en la deserialización y solo se preocupa por el campo de respaldo, que obviamente no está presente en el objeto JavaScript.
Dado que no hay una forma estándar de nombrar los campos de respaldo y para ser honesto, ni siquiera quiero molestarme con el "vamos a crear un objeto JavaScript que se vea como si tuviera campos de respaldo C #", ya que suena un poco sucio, la única manera Podría serializar los campos de JavaScript en C-auto-properties si pudiera forzar al motor de serialización a ignorar de alguna manera el campo de respaldo y usar la propiedad directamente. Lamentablemente, no puedo entender cómo se hace esto o si esto se puede hacer en absoluto. Cualquier idea sería apreciada.
EDITAR : Aquí hay un ejemplo:
Javascript:
function Cat()
{
this.Name = "Whiskers";
this.Breed = "Tabby";
}
var cat = new Cat();
Esto se serializa a "{Nombre: ''Bigotes''}".
La clase C #:
[Serializable()]
public class Cat
{
public string Name { get; set; }
public string Breed { get; set; }
}
Y el código de deserialización, que falla:
new DataContractJsonSerializer(typeof(Cat)).ReadObject(inputStream);
Y es evidente por la excepción que falla porque está buscando el campo de respaldo.
EDIT2 : Aquí está la excepción, si eso ayuda (sin excepciones internas):
System.Runtime.Serialization.SerializationException
"El tipo de contrato de datos ''Test.Cat'' no se puede deserializar porque no se encontraron los datos requeridos ''
<Name>k__BackingField, <Breed>k__BackingField
''."
Lo que sucede aquí es que el deserializador está tratando de adivinar el nombre de tus campos de respaldo. Puede resolver esto agregando mapeos explícitos (atributos DataContract / DataMember) como este:
[DataContract]
public class Cat
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Breed { get; set; }
}
Puede hacer esto con el JavaScriptSerializer
encuentra en el espacio de nombres System.Web.Script.Serialization
:
JavaScriptSerializer serializer = new JavaScriptSerializer();
Cat c = serializer.Deserialize<Cat>(jsonString);
Tengo objetos POCO con propiedades automáticas y esto funciona bien.
EDITAR: Escribí sobre Seriales de JSON en .NET que compara este serializador con DataContractJsonSerializer
.
Supongo que está transfiriendo datos a través de un servicio web. Si está utilizando la clase WebService con el atributo ScriptMethod descompuesto, los métodos del servicio web pueden leer JSON de forma nativa. Incluso usan el mismo JavaScriptSerializer que se mencionó anteriormente. Si está usando WCF, soy un poco más confuso con la lógica.
Pero asegúrese de que su objeto JSON devuelva datos para TODAS las propiedades de su clase. En su error, se menciona una propiedad de Raza que no está en su ejemplo.
Además, en el lado de JavaScript, a la naturaleza dinámica de JavaScript, es fácil agregar nuevas propiedades a sus objetos. Esto a veces puede conducir a referencias circulares. Debe eliminar los datos adicionales que haya agregado (al igual que está enviando datos a través del método web, y luego volver a agregarlos una vez que haya terminado).
La respuesta de Baretta resolvió la hinchazón k__BackingField para mí. Solo un pequeño apéndice que puede decorar esta clase para serializar automáticamente en XML o JSON de una manera similar:
[Serializable, XmlRoot, DataContract]
public class Cat
{
[XmlElement]
[DataMember]
public string Name { get; set; }
[XmlElement]
[DataMember]
public string Breed { get; set; }
}
... y luego use DataContractJsonSerializer o XmlSerializer para prepararlo para su endpoint.