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

在将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")] } 

返回的json的例子:

 home: Object <FirstName>k__BackingField: "Storefront" <LastName>k__BackingField: "Doors" 

如果类可以在序列化中使用,则实际不build议使用自动属性语法。 原因是后台字段是由编译器生成的,每次编译代码都可能不同。 这可能会导致不兼容问题,即使没有改变类(只是重新编译代码)。

我认为应用DataMember属性将解决这个问题。 但是我会build议使用全属性语法,如果类需要在序列化中使用。

从你的class级中删除[Serializable]

默认的WebApi序列化器会将“__BackingField:”语法添加到c#auto-properties中。 把它添加到App_Start中的WebConfig中,以获得您可能正在寻找的更清晰的json。

 config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings(); 

我们有一些标记为[Serializable]对象,所以它们可以使用传统的方法进行序列化,但是我们需要在JSON中使用Web API进行干净的序列化。 将IgnoreSerializableAttribute设置为true将使Newtonsoft.Json停止行为,类似于微软的serialisers,而只是将公有属性序列化。

TLDR:将此添加到WebApiConfig.cs:

 ((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true; 

主持人:请删除重复的问题,而不是删除多次提问的问题的答案。 这是有效问题的有效答案。

简单易用暴露数据的方式我们需要将对象中的数据公开为容易阅读和一致的格式

先删除[Serializable]

  [Serializable] 

现在在类中添加[DataContract],在下面的例子中添加属性[DataMember]

 [DataContract] public class UserDiscretion : UserReport { [DataMember] public String DiscretionCode { get; set; } public String DiscretionDescription { get; set; } } 

希望这个帮助
谢谢。

另一种解决scheme,可能有助于在JSON.NET的情况下。 使用[Newtonsoft.Json.JsonObject]属性标记类可能就足够了。

我正在使用从xsd构build的cs类,并使用部分类添加一些属性。 json序列化后,这些属性用k_BackingField标记。 在其他答案中提到的JsonFormatter设置也有帮助,但更简单的是用[JsonObject]属性标记部分类。

我使用DataContractJsonSerializer和另一个具有Serializable属性的程序DataContractJsonSerializer的类。 输出包含“k_BackingField”。 删除Serializable属性(在另一个程序集中)解决了这个问题。 不知道为什么。

几个选项:

  1. 从模型中删除[Serializable]

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

  3. App_Start/WebApiConfig.cs添加到App_Start/WebApiConfig.cs

 config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings(); 

假设你在你的MVC项目中看到这个问题,我发现replace@ Html.JsonData的使用非常简单。 这是过去为我工作的代码片段:

 <input type="hidden" id="Model" value="@Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model))" /> 

不如优雅,但简单的捏。

当我在我的课堂上有自我引用属性时,我遇到了这个问题,

 class Person { List<Person> Friends { get; set;} } 

结果,这个人是自己的朋友。 我只是确保我的结果集中没有自引用对象。 希望这可以帮助。

朋友,不要声明这样的属性:

 public String DiscretionCode { get; set; } public String DiscretionDescription { get; set; } 

但是,创造像老一样的变数。

 private String discretionCode; public String DiscretionCode { get { return discretionCode;} set { discretionCode = value; } }