C#自动对JSON进行反序列化

Tam*_*ege 50 .net c# serialization json automatic-properties

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

鉴于没有标准的方法来命名支持字段,说实话,我甚至不想打扰"让我们创建一个看起来像C#支持字段的JavaScript对象"的方法,因为它听起来有点脏,唯一的方法如果我可以强制序列化引擎以某种方式忽略支持字段并直接使用属性,我可以将JavaScript字段序列化为C#auto-properties.不幸的是,我无法弄清楚这是如何完成的,或者是否可以完成.任何想法,将不胜感激.

编辑:这是一个例子:

使用Javascript:

function Cat()
{
    this.Name = "Whiskers";
    this.Breed = "Tabby";
}
var cat = new Cat();
Run Code Online (Sandbox Code Playgroud)

然后将其序列化为"{Name:'Whiskers'}".

C#类:

[Serializable()]
public class Cat
{
    public string Name { get; set; }
    public string Breed { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

而反序列化代码失败了:

new DataContractJsonSerializer(typeof(Cat)).ReadObject(inputStream);
Run Code Online (Sandbox Code Playgroud)

从例外情况可以看出它失败了,因为它正在寻找支持领域.

EDIT2:这是例外,如果有帮助(没有内部异常):

System.Runtime.Serialization.SerializationException

"数据合同类型'Test.Cat'无法反序列化,因为<Name>k__BackingField, <Breed>k__BackingField找不到所需的数据成员' ."

bar*_*tta 80

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

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

    [DataMember]
    public string Breed { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果可以,我会+2.现在寻找答案. (2认同)

ale*_*emb 20

你可以JavaScriptSerializerSystem.Web.Script.Serialization命名空间中找到它:

JavaScriptSerializer serializer = new JavaScriptSerializer();
Cat c = serializer.Deserialize<Cat>(jsonString);
Run Code Online (Sandbox Code Playgroud)

我有自动属性的POCO对象,这很好用.

编辑:我在.NET中写了一些JSON Serializers,它将这个序列化器与之比较DataContractJsonSerializer.


ame*_*vin 5

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; }
}
Run Code Online (Sandbox Code Playgroud)

...然后使用DataContractJsonSerializer或XmlSerializer为您的端点做好准备.