JSON的C#自动属性反序列化
我需要将以JSON表示的一些JavaScript对象反序列化为适当的C#类。 鉴于自动属性的好处,我宁愿让他们在这些类,而不是只有字段。 不幸的是,.NET序列化引擎(至less在默认情况下)完全忽略了反序列化的自动属性,只关心后台字段,这在JavaScript对象中显然不存在。
鉴于没有标准的方式来命名支持字段 ,说实话,我甚至不想打扰“让我们创build一个看起来像它有C#支持领域的JavaScript对象”的方法,因为它听起来有点肮脏,唯一的方法我可以将JavaScript字段序列化为C#自动属性,如果我可以强制序列化引擎以某种方式忽略后台字段并直接使用该属性。 不幸的是,我无法弄清楚这是如何完成的,或者是否可以完成。 任何想法,将不胜感激。
编辑 :这里是一个例子:
使用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);
从例外情况看,它显然是因为它正在寻找支持领域而失败。
编辑2 :这是例外,如果有帮助(没有内部例外):
System.Runtime.Serialization.SerializationException
“数据协定types”Test.Cat“不能被反序列化,因为找不到所需的数据成员
<Name>k__BackingField, <Breed>k__BackingField
。
这里发生了什么是解串器试图猜测你的后台名称。 你可以通过添加显式映射(DataContract / DataMember属性)来解决这个问题:
[DataContract] public class Cat { [DataMember] public string Name { get; set; } [DataMember] public string Breed { get; set; } }
您可以使用System.Web.Script.Serialization
命名空间中的JavaScriptSerializer
来执行此操作:
JavaScriptSerializer serializer = new JavaScriptSerializer(); Cat c = serializer.Deserialize<Cat>(jsonString);
我有自动属性的POCO对象,这工作得很好。
编辑:我写了关于JSON序列化器在.NET中比较此序列化器与DataContractJsonSerializer
。
baretta的答案为我解决了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为您的端点做好准备。
我假设你正在通过Web服务传递数据。 如果使用未注释掉ScriptMethod属性的WebService类,则Web服务方法可以本机读取JSON。 他们甚至使用上面提到的相同的JavaScriptSerializer。 如果你使用的是WCF,我更加模糊逻辑。
但请确保您的JSON对象正在为您的类中的每个属性返回数据。 在你的错误中,提到了一个不属于你的例子的品种属性。
另外,在JavaScript方面,要做到JavaScript的dynamic特性,很容易为对象添加新的属性。 这有时会导致循环引用。 您应该删除您可能添加的任何额外数据(就像通过Web方法发送数据一样,然后在完成后再次添加)。