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 легко добавить новые свойства для ваших объектов. Иногда это может привести к циклической ссылки. Вы должны удалить все дополнительные данные, которые вы могли бы добавить (так же, как вы отправляете данные через веб-метод, а затем добавить его снова, как только вы закончите).