当前位置: 首页 > 面试题库 >

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

雍志新
2023-03-14
问题内容

我需要反序列化一些JSON表示的JavaScript对象为适当的C#类。鉴于自动属性的出色功能,我宁愿将它们放在这些类中,而不是仅包含字段。不幸的是,.NET序列化引擎(至少默认情况下)完全忽略了反序列化的自动属性,而只关心背景字段,而该字段显然不在JavaScript对象中。

鉴于没有标准的方法来命名后备字段并且说实话,我什至不想使用“让我们创建一个看起来像具有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);

从例外可以明显看出它失败了,因为它正在寻找支持字段。

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

System.Runtime.Serialization.SerializationException

“数据合同类型’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; }
}


 类似资料:
  • 问题内容: 我有以下需要反序列化的Json字符串。 第一个字段“ 123456789”是一个ID号,因此基本上该值可以根据要查询的数据而有所不同。 我在Visual Studio中使用C#。显然,因为第一个字段的值可以更改,所以我无法使用预定义的类将JSON反序列化为该字段,因为该字段将用作类名,但该字段的值与该类名不匹配。 有没有一种方法可以将其反序列化为某种动态类,但仍可以像访问预定义类一样访

  • 我想解析这个json文件。 {“特征”:[{“类型”:“特征”,“几何”:“{“类型”:“多边形”,“坐标”:[[26.4217861898109,40.127607984644],[26.4219934821323,40.1275230229872],[26.4218810759267,40.1273800013679],[26.4216801413981,40.1274730404221],[

  • 我正在尝试使用Gson反序列化格式为“2018-05-27”的json中的date属性。在反序列化之后,我希望日期为LocalDate格式。 对于json输入: {"id": 1,"name":"test","start Date":"2018-01-01","endDate":"2018-01-05",} 我收到startDate和endDate的错误: Java语言lang.IllegalSt

  • 问题内容: 使用Jackson 2,我正在寻找一种 通用的 方式将对象序列化为单个值(然后序列化它们,然后再填充该单个字段),而不必重复创建JsonSerializer / JsonDeserializer来处理每种情况。@JsonIdentityInfo批注非常接近,但由于我知道,它将始终对完整的子对象进行序列化,因此略微遗漏了该标记。 这是我想做的一个例子。给定的类: 我希望Order可以序列

  • 问题内容: 我正在针对返回JSON数据的第三方API进行编程,但是格式可能有点奇怪。某些属性可以是一个对象(包含一个Id属性),也可以是一个字符串(它是该对象的ID)。例如,以下两个都是有效的: 和 我正在尝试使用JSON.net将其反序列化为强类型类,但到目前为止运气还不足。我最好的主意是将其序列化为两个属性,一个为字符串,另一个为对象,并为每个属性使用自定义JsonConverter以允许变量

  • 我一直在做一个项目,需要通过JSON文件保存和加载数据。此 JSON 文件包含其他对象的各种列表。但是,当我继续反序列化文件时,会发生这种情况: 系统。NotSupportedException:不支持反序列化没有无参数构造函数、单一参数化构造函数或用“JsonConstructorAttribute”批注的参数化构造函数的类型。 处理反序列化的代码如下: 我想反序列化的类 JSON转换器 Sav