如何在 Deserialize 时删除 json 中的 k__ BackingField

在将 xml 文件序列化到.net c # 对象之后,我在返回的 json 中获得了 k _ BackingField。

I've added the DataContract and the DataMember attribute to the .net c# object but then I get nothing on the json, client end.

[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"
73904 次浏览

如果类可以在序列化中使用,则实际上不推荐使用自动属性语法。原因是后备字段是由编译器生成的,编译器每次编译代码时可能会有所不同。即使没有对类进行更改(只是重新编译代码) ,这也会导致不兼容性问题。

我认为应用 DataMember 属性可以解决这个问题。但是,如果类需要用于序列化,我建议使用完整属性语法。

假设您在 MVC 项目中看到了这个问题,我发现替换使用@Html 非常简单。JsonData.下面是我过去使用过的一段代码:

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

没那么优雅,但必要时也很简单。

我将 DataContractJsonSerializer与来自另一个具有 Serializable属性的程序集的类一起使用。输出包含“ k _ _ BackingField”。删除 Serializable属性(在另一个程序集中)修复了这个问题。不知道为什么。

从类中删除 [Serializable]

公开数据的简单易行的方法 我们需要将对象中的数据公开为易读和一致的格式


首先移除 [序列化]

    [Serializable]

现在在类中添加 [资料合约],在属性中添加 [资料会员],如下例所示

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

希望这能帮上忙
谢谢。

Friends, don't declare properties like this:

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

But, create auxiliar vars, like old....

private String discretionCode;


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

The default WebApi serializer will add that "__BackingField:" syntax to c# auto-properties. Add this to your WebConfig in App_Start to get the cleaner looking json that you might be looking for.

using Newtonsoft.Json;
...


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

我们有一些被标记为 [Serializable]的对象,因此它们可以使用传统的方法进行序列化,但是我们需要使用 JSON 对它们进行干净的序列化,以便与 Web API 一起使用。将 IgnoreSerializableAttribute设置为 true将停止牛顿软件。Json 的行为就像微软的序列化程序,相反,它将只是序列化公共财产。

TLDR: 添加到 WebApiConfig.cs:

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

主持人: 与其删除一个已经被问过好几次的问题的好答案,不如删除重复的问题。这是一个有效问题的有效答案。

在 JSON.NET 情况下可能有帮助的另一个解决方案。这可能足以用牛顿软件来标记阶级。杰森。属性。

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

有几个选择:

  1. 从模型中删除 [Serializable]

  2. Add [DataContract] and [DataMember] to your model along with [Serializable]

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

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

当我在类中具有自引用属性时,我遇到了这个问题,例如;

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

结果,这个人和自己成了朋友。我只是确保在我的结果集中没有自引用对象。希望这个能帮上忙。

我必须使用[ Serializer ]属性,因此不能删除它。

XmlSerializer 忽略 WebApi 中的[ XmlAttribute ]

上述决议为我解决了这个问题。

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

在我的情况下,这个错误是为牛顿软件。Json Version,服务器寻找6.0.0版本,而我有11.0版本,所以我必须安装6.0.0版本