Как удалить K BackingField из json при десериализации
Я получаю k_BackingField в моем возвращенном json после сериализации xml-файла в объект .net c#.
я добавил 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"
11 ответов:
синтаксис автоматического свойства на самом деле не рекомендуется, если класс может быть использован в сериализации. Причина в том, что резервное поле генерируется компилятором, который может быть разным каждый раз, когда код компилируется. Это может вызвать проблемы несовместимости, даже если в класс не вносится никаких изменений (просто перекомпиляция кода).
Я думаю, что применение атрибута DataMember устранит проблему в этом случае. Но я бы рекомендовал использовать полный синтаксис свойств, если класс должен использоваться в сериализация.
по умолчанию сериализатор веб-API будет добавить, что "__BackingField:" синтаксис в C# свойства Auto. Добавьте это в свой WebConfig в App_Start, чтобы получить более чистый JSON, который вы, возможно, ищете.
config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();
у нас есть некоторые объекты, которые помечены как
[Serializable]таким образом, они могут быть сериализованы с использованием традиционных методов, но которые нам нужно чисто сериализовать в JSON для использования с веб-API. УстановкаIgnoreSerializableAttributeдоtrueостановит Newtonsoft.Json ведет себя как сериализаторы Microsoft, и вместо этого он просто сериализует общедоступные свойства.TLDR: добавьте это в WebApiConfig.cs:
((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;модератор: вместо того, чтобы удалять действительно хороший ответ на вопрос, который имеет был задан несколько раз, пожалуйста, удалите дубликат вопроса. Это правильный ответ на правильный вопрос.
простой легкий и достойный способ выставить данные Нам нужно выставить данные в объекте в удобном для чтения и согласованном формате
удалить [сериализуемые][Serializable]добавлять [DataContract] в класс и [DataMember] для свойства, как показано ниже пример
[DataContract] public class UserDiscretion : UserReport { [DataMember] public String DiscretionCode { get; set; } public String DiscretionDescription { get; set; } }надеюсь, что это поможет
спасибо.
два варианта:
удалить
[Serializable]моделидобавить
[DataContract]и[DataMember]в вашей модели вместе с[Serializable]добавить ниже строки
App_Start/WebApiConfig.csconfig.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();
другое решение, которое может помочь в случае JSON.NET. возможно, достаточно отметить класс с помощью [Newtonsoft.формат JSON.Атрибут JsonObject].
Я работал с классами cs, построенными из xsd, и добавлял некоторые свойства, используя частичные классы. После сериализации json эти свойства были отмечены символом k_BackingField. Настройки JsonFormatter, упомянутые в других ответах, также помогли, но более простым было отметить частичный класс с атрибутом [JsonObject].
предполагая, что вы видите эту проблему внутри вашего проекта MVC, я обнаружил, что довольно просто заменить использование @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; } }
Comments