如何反序列化时从json中删除k__BackingField

Fil*_* DO 94 .net serialization json deserialization

在将xml文件序列化为.net c#对象后,我在返回的json中获取k_BackingField.

我已经将DataContract和DataMember属性添加到.net c#对象中,但是在json,客户端没有得到任何结果.

[XmlRoot("person")]
[Serializable]
public class LinkedIn
{
    [XmlElement("id")]
    public string ID { get; set; }

    [XmlElement("industry")]
    public string Industry { get; set; }

    [XmlElement("first-name")]
    public string FirstName { get; set; }

    [XmlElement("last-name")]
    public string LastName { get; set; }
    [XmlElement("headline")]
}
Run Code Online (Sandbox Code Playgroud)

返回的json示例:

home: Object
<FirstName>k__BackingField: "Storefront"
<LastName>k__BackingField: "Doors"
Run Code Online (Sandbox Code Playgroud)

小智 97

[Serializable]从班级中删除

  • 这不适用于WCF服务.使用RESTful服务返回有效负载时,如果删除[Serializable],则不会产生任何数据.添加System.Runtime.Serialization并使用[DataContract]作为类,[DataMember]作为属性. (11认同)
  • 现在我想知道为什么我认为我首先需要[Serializable].我的Xml序列化无需工作,JSON无需工作. (2认同)

小智 49

默认的WebApi序列化程序会将"__BackingField:"语法添加到c#auto-properties.将其添加到App_Start中的WebConfig,以获得您可能正在寻找的更清晰的json.

using Newtonsoft.Json;
...

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();
Run Code Online (Sandbox Code Playgroud)

  • 这解决了这个问题.我认为汽车房产很干净.使用各地的支持领域似乎很愚蠢.并引入了很多混乱,有时甚至是混乱. (3认同)
  • 问题是为什么在地球上WebApi序列化器默认会添加"__BackingField:"? (3认同)
  • 如果没有 StackOverflow,我该怎么办?谢谢。 (3认同)

jag*_*ags 43

如果可以在序列化中使用该类,则实际上不建议使用自动属性语法.作为支持字段的原因是由编译器生成的,每次编译代码时都可以是不同的.即使没有对类进行任何更改(仅重新编译代码),这也可能导致不兼容问题.

我认为应用DataMember属性将解决此案例中的问题.但是如果需要在序列化中使用类,我建议使用完整属性语法.

  • 将datacontract添加到类的顶部,并将datamember添加到我感兴趣的每个属性中. (20认同)
  • @ AlumCloud.Com为[DataContract]和[DataMember] +1.不要忘记添加:System.Runtime.Serialization (3认同)

Ric*_*ard 35

我们有一些被标记为的对象,[Serializable]因此可以使用传统方法对它们进行序列化,但我们需要在JSON中对其进行干净地序列化以便与Web API一起使用.设置IgnoreSerializableAttributetrue将阻止Newtonsoft.Json表现得像微软的序列化器,而只是序列化公共属性.

TLDR:将其添加到WebApiConfig.cs:

((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;
Run Code Online (Sandbox Code Playgroud)

主持人:请删除重复的问题,而不是删除多次询问的问题的真正好答案.这是对有效问题的有效答案.

  • 这应该是正确的答案.删除序列化或使用datacontract和datamember属性并不总是正确的解决方案. (3认同)

Rin*_*nku 9

简单易用和体现公开数据的方式 我们需要将对象中的数据公开,以便于读取和一致的格式


首先删除[Serializable]

    [Serializable]
Run Code Online (Sandbox Code Playgroud)

现在在类和[DataMember]中添加[DataContract]属性,如下例所示

[DataContract]
public class UserDiscretion : UserReport
{
    [DataMember]
    public String DiscretionCode { get; set; }
    public String DiscretionDescription { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

希望这个帮助
谢谢.


小智 5

几个选择:

  1. [Serializable]从模型中删除

  2. [DataContract]和添加[DataMember]到模型中 [Serializable]

  3. 将以下行添加到 App_Start/WebApiConfig.cs

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();
Run Code Online (Sandbox Code Playgroud)