112

在将 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"
4

13 回答 13

112

[Serializable]从您的班级中删除

于 2015-01-06T10:09:54.087 回答
64

默认的 WebApi 序列化程序会将“__BackingField:”语法添加到 c# 自动属性中。将此添加到 App_Start 中的 WebConfig 以获得您可能正在寻找的更清晰的 json。

using Newtonsoft.Json;
...

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();
于 2016-02-26T19:11:10.703 回答
47

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

我认为应用 DataMember 属性将解决这种情况下的问题。但如果需要在序列化中使用该类,我建议使用完整的属性语法。

于 2012-10-23T01:27:52.117 回答
37

我们有一些对象被标记为[Serializable]可以使用传统方法进行序列化,但我们需要在 JSON 中干净地序列化这些对象才能与 Web API 一起使用。设置IgnoreSerializableAttributetrue将阻止 Newtonsoft.Json 的行为类似于 Microsoft 的序列化程序,而只会序列化公共属性。

TLDR:将此添加到 WebApiConfig.cs:

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

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

于 2016-04-28T09:24:39.553 回答
11

简单而体面的数据公开方式 我们需要将对象中的数据公开为易于阅读和一致的格式


首先删除[Serializable]

    [Serializable]

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

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

希望这个帮助
谢谢。

于 2016-02-08T09:26:14.663 回答
8

几个选项:

  1. [Serializable]从模型中移除

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

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

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();
于 2017-05-01T15:51:07.260 回答
3

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

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

于 2016-07-27T16:50:02.287 回答
2

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

于 2014-12-11T00:07:51.717 回答
0

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

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

没有那么优雅,但在紧要关头很简单。

于 2014-02-12T18:26:58.113 回答
0

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

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

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

于 2017-10-19T19:21:36.333 回答
0

我必须使用 [Serializable] 属性,所以删除它不是一个选项。

XmlSerializer 忽略 WebApi 中的 [XmlAttribute]

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

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
于 2018-10-24T07:15:21.010 回答
0

在我的情况下,这个错误是针对 Newtonsoft.Json 版本的,服务器寻找 6.0.0 版本,我有 11.0,所以我必须安装 6.0.0 版本

于 2019-08-21T20:38:53.080 回答
-2

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

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

但是,创建辅助变量,如旧......

private String discretionCode;

public String DiscretionCode 
{ 
    get { return discretionCode;}
    set { discretionCode = value; }
}
于 2016-02-11T12:18:24.657 回答