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

时间:2012-10-23 01:04:28

标签: .net json serialization 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")]
}

返回的json示例:

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

13 个答案:

答案 0 :(得分:90)

从班级中删除[Serializable]

答案 1 :(得分:46)

默认的WebApi序列化程序将添加&#34; __ BackingField:&#34;语法到c#auto-properties。将其添加到App_Start中的WebConfig,以获得您可能正在寻找的更清晰的json。

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

答案 2 :(得分:41)

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

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

答案 3 :(得分:33)

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

TLDR:将其添加到WebApiConfig.cs:

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

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

答案 4 :(得分:9)

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


首先删除 [Serializable]

    [Serializable]

现在在课堂上添加 [DataContract] ,在 [DataMember] 添加属性,如下例

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

希望这有帮助
感谢。

答案 5 :(得分:4)

几个选项:

  1. 从模型中删除[Serializable]

  2. [DataContract][DataMember][Serializable]

  3. 一起添加到您的模型中
  4. 将以下行添加到App_Start/WebApiConfig.cs

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

答案 6 :(得分:2)

我正在使用DataContractJsonSerializer来自另一个具有Serializable属性的程序集的类。输出包含&#34; k__BackingField&#34;。删除Serializable属性(在另一个程序集中)修复此问题。不知道为什么。

答案 7 :(得分:2)

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

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

答案 8 :(得分:0)

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

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

不那么优雅,但却很简单。

答案 9 :(得分:0)

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

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

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

答案 10 :(得分:0)

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

XmlSerializer ignores [XmlAttribute] in WebApi

以上分辨率为我解决了

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

答案 11 :(得分:0)

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

答案 12 :(得分:-2)

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

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

但是,创建辅助变量,就像旧的......

private String discretionCode;

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