C#JSON的自动属性反序列化

C#JSON的自动属性反序列化,c#,.net,json,serialization,automatic-properties,C#,.net,Json,Serialization,Automatic Properties,我需要将JSON中表示的一些JavaScript对象反序列化为适当的C#类。鉴于自动属性的良好特性,我更喜欢在这些类中使用它们,而不是只使用字段。不幸的是,.NET序列化引擎(至少在默认情况下)完全忽略反序列化的自动属性,而只关心支持字段,这显然不存在于JavaScript对象中 考虑到存在,老实说,我甚至不想为“让我们创建一个看起来有C#backing fields的JavaScript对象”的方法而烦恼,因为它听起来有点脏,如果我可以强制序列化引擎以某种方式忽略支持字段并直接使用属性,那么我

我需要将JSON中表示的一些JavaScript对象反序列化为适当的C#类。鉴于自动属性的良好特性,我更喜欢在这些类中使用它们,而不是只使用字段。不幸的是,.NET序列化引擎(至少在默认情况下)完全忽略反序列化的自动属性,而只关心支持字段,这显然不存在于JavaScript对象中

考虑到存在,老实说,我甚至不想为“让我们创建一个看起来有C#backing fields的JavaScript对象”的方法而烦恼,因为它听起来有点脏,如果我可以强制序列化引擎以某种方式忽略支持字段并直接使用属性,那么我就可以将JavaScript字段序列化为C#auto属性。不幸的是,我不知道这是如何做到的,或者这是否可以做到。任何想法都将不胜感激

编辑:下面是一个示例:

Javascript:

function Cat()
{
    this.Name = "Whiskers";
    this.Breed = "Tabby";
}
var cat = new Cat();
然后将其序列化为“{Name:'胡须'}”

C级:

以及反序列化代码,该代码失败:

new DataContractJsonSerializer(typeof(Cat)).ReadObject(inputStream);
从异常中可以明显看出,它失败是因为它正在寻找支持字段

EDIT2:以下是例外情况,如果有帮助的话(没有内部异常):

System.Runtime.Serialization.SerializationException

“数据契约类型‘Test.Cat’ 无法反序列化,因为 所需数据成员 “
k_ubackingfield,k_ubackingfield
”不是 找到了。”


您可以使用
System.Web.Script.Serialization
命名空间中的
JavaScriptSerializer
执行此操作:

JavaScriptSerializer serializer = new JavaScriptSerializer();
Cat c = serializer.Deserialize<Cat>(jsonString);
JavaScriptSerializer serializer=新的JavaScriptSerializer();
Cat c=序列化程序。反序列化(jsonString);
我有具有自动属性的POCO对象,这很好用


编辑:我写了关于将此序列化程序与
DataContractJsonSerializer

进行比较的内容,我假设您是通过web服务传递数据的。如果使用未注释ScriptMethod属性的WebService类,则web服务方法可以本机读取JSON。他们甚至使用上面提到的同一个JavaScriptSerializer。如果你使用的是WCF,我在逻辑上有点模糊

但要确保JSON对象返回类中每个属性的数据。在您的错误中,提到了您的示例中没有提到的品种属性


另外,在JavaScript方面,根据JavaScript的动态特性,很容易向对象添加新属性。这有时会导致循环引用。您应该删除可能添加的任何额外数据(就像您通过web方法发送数据一样,然后在完成后再次添加数据)。

这里发生的情况是,反序列化程序正在尝试猜测支持字段的名称。 您可以通过添加显式映射(DataContract/DataMember属性)来解决此问题,如下所示:

[DataContract]
public class Cat
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Breed { get; set; }
}
帮我解决了k_uBackingfield的问题。只是一个小小的附录,您可以用类似的方式将此类修饰为自动序列化为XML或JSON:

[Serializable, XmlRoot, DataContract]
public class Cat
{
  [XmlElement]
  [DataMember]
  public string Name { get; set; }
  [XmlElement]
  [DataMember]
  public string Breed { get; set; }
}

。。。然后使用DataContractJsonSerializer或XmlSerializer为端点准备它。

你能举一个例子说明你的意思吗?@John Saunders——假设我得到了一个名为“Cat”的JavaScript对象,其中有一个名为“Name”的字段,值为“Whiskers”。假设这是用JSON表示的。我想获取这个JSON并将其序列化到C#Cat类(由我编写)的实例中,以便序列化过程使用“胡须”填充实例的自动属性“名称”…但问题是序列化程序正在查找支持字段(例如,“k#u backingField”,但不一定使用此名称)而不是“Name”“。您使用的是什么序列化程序?另外,我还没有使用过这个,但也许您应该使用[DataContract]和[DataMember]而不是[Serializable]?不,很遗憾,这不是Web服务。它是一个简单的ajax请求,将json格式的数据传递给服务器。另外,我很确定没有循环引用。你是对的,在这个例子中没有繁殖属性,但在我的真实代码中,所有属性都在那里。不过,感谢您的建议:)在JavaScript方面:您如何将JavaScript对象转换为JSON?是的,我回答的第一个问题是一个很好的JsonExSerializer+1,但当时我没有代表投票支持这个答案!如果可以的话,我愿意+2。现在正在寻找这个问题的答案。太棒了!我错过了[DataContract]属性:(
[Serializable, XmlRoot, DataContract]
public class Cat
{
  [XmlElement]
  [DataMember]
  public string Name { get; set; }
  [XmlElement]
  [DataMember]
  public string Breed { get; set; }
}