C# автоматическая десериализация свойств JSON
мне нужно десериализовать некоторый объект JavaScript, представленный в JSON, в соответствующий класс C#. Учитывая приятные особенности автоматических свойств, я бы предпочел иметь их в этих классах, а не просто иметь поля. К сожалению, механизм сериализации .NET (по крайней мере, по умолчанию) полностью игнорирует автоматические свойства десериализации и заботится только о поле поддержки, которого, очевидно, нет в объекте JavaScript.
учитывая, что нет стандартного способа назвать резервные поля и, честно говоря, я даже не хочу беспокоиться о "Давайте создадим объект JavaScript, который выглядит так, как будто у него есть резервные поля C#", поскольку это звучит немного грязно, единственный способ сериализовать поля JavaScript в C# auto-properties, если я могу заставить механизм сериализации каким-то образом игнорировать резервное поле и использовать свойство напрямую. К сожалению, я не могу понять, как это делается или можно ли это сделать вообще. Любые идеи будьте благодарны.
редактировать: вот пример:
Javascript:
function Cat()
{
this.Name = "Whiskers";
this.Breed = "Tabby";
}
var cat = new Cat();
затем сериализуется в " {Name:'Whiskers'}".
класс C#:
[Serializable()]
public class Cat
{
public string Name { get; set; }
public string Breed { get; set; }
}
и код десериализации, который терпит неудачу:
new DataContractJsonSerializer(typeof(Cat)).ReadObject(inputStream);
и из исключения видно, что он терпит неудачу, потому что он ищет резервное поле.
EDIT2: вот исключение, если это помогает (нет внутренней исключения):
4 ответов
здесь происходит то, что десериализатор пытается угадать имя ваших резервных полей. Вы можете решить эту проблему, добавив явные сопоставления (атрибуты DataContract/DataMember) следующим образом:
[DataContract]
public class Cat
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Breed { get; set; }
}
вы можете сделать это с помощью JavaScriptSerializer
в папке System.Web.Script.Serialization
пространство имен:
JavaScriptSerializer serializer = new JavaScriptSerializer();
Cat c = serializer.Deserialize<Cat>(jsonString);
у меня есть объекты POCO с автоматическими свойствами, и это работает просто отлично.
EDIT: я писал о сериализаторы JSON в .NET который сравнивает этот сериализатор с DataContractJsonSerializer
.
"Беретту" в решил K _ _ BackingField вздутие для меня. Просто крошечное добавление, которое вы можете украсить этот класс для автоматической сериализации в XML или JSON аналогичным образом:
[Serializable, XmlRoot, DataContract]
public class Cat
{
[XmlElement]
[DataMember]
public string Name { get; set; }
[XmlElement]
[DataMember]
public string Breed { get; set; }
}
... а затем используйте DataContractJsonSerializer или XmlSerializer, чтобы подготовить его для вашей конечной точки.
Я предполагаю, что вы передаете данные через веб-сервис. Если вы используете класс WebService с атрибутом scriptmethod uncommented-out, методы веб-службы могут читать JSON изначально. Они даже используют тот же JavaScriptSerializer, который был упомянут выше. Если вы используете WCF, я немного более нечеткий в логике.
но убедитесь, что ваш объект JSON возвращает данные для каждого свойства в вашем классе. В вашей ошибке есть упоминание о свойстве породы, которого нет в ваш пример.
кроме того, на стороне JavaScript, сделайте динамический характер JavaScript легко добавить новые свойства для ваших объектов. Иногда это может привести к циклической ссылки. Вы должны удалить все дополнительные данные, которые вы могли бы добавить (так же, как вы отправляете данные через веб-метод, а затем добавить его снова, как только вы закончите).