Как удалить k__BackingField из json, когда Deserialize
Я получаю k_BackingField в моем возвращенном json после сериализации xml файла в объект .net С#.
Я добавил атрибут DataContract и DataMember в объект .net С#, но потом ничего не получаю на стороне 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"
Ответы
Ответ 1
Синтаксис автоматического синтаксиса на самом деле не рекомендуется, если класс может использоваться в сериализации. Причина, лежащая в основе поля поддержки, генерируется компилятором, который может быть различным при каждом компиляции кода времени. Это может вызвать проблемы несовместимости, даже если в класс не внесены изменения (просто перекомпилируйте код).
Я думаю, что применение атрибута DataMember будет устранять проблему в этом случае. Но я бы рекомендовал использовать полный синтаксис свойств, если класс должен использоваться в сериализации.
Ответ 2
Удалите [Serializable]
из вашего класса
Ответ 3
Сериализатор WebApi по умолчанию добавит синтаксис "__BackingField:" в авто-свойства С#. Добавьте это в свой WebConfig в App_Start, чтобы получить более чистый вид json, который вы, возможно, ищете.
using Newtonsoft.Json;
...
config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();
Ответ 4
У нас есть некоторые объекты, которые помечены как [Serializable]
, поэтому их можно сериализовать с использованием традиционных методов, но мы должны иметь чисто сериализованную в JSON для использования с Web API. Установка IgnoreSerializableAttribute
в true
остановит Newtonsoft.Json от поведения, как сериализаторы Microsoft, и вместо этого он просто сериализует общедоступные свойства.
TL;DR: добавьте это в WebApiConfig.cs:
((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;
Модератор: вместо того, чтобы удалять действительно хороший ответ на вопрос, который был задан несколько раз, удалите дублированный вопрос. Это действительный ответ на правильный вопрос.
Ответ 5
Простой и достойный способ публикации данных
Нам нужно выставить данные в объекте в легко читаемый и согласованный формат
Сначала удалите [Serializable]
[Serializable]
теперь добавьте [DataContract] в класс и [DataMember] для свойства, как показано ниже.
[DataContract]
public class UserDiscretion : UserReport
{
[DataMember]
public String DiscretionCode { get; set; }
public String DiscretionDescription { get; set; }
}
Надеюсь, что эта помощь
Спасибо.
Ответ 6
Пара вариантов:
-
Удалите [Serializable]
из модели
-
Добавьте [DataContract]
и [DataMember]
в свою модель вместе с [Serializable]
-
Добавьте строку ниже App_Start/WebApiConfig.cs
config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();
Ответ 7
Другое решение, которое может помочь в случае JSON.NET. Этого может быть достаточно, чтобы пометить класс атрибутом [Newtonsoft.Json.JsonObject].
Я работал с классами cs, созданными из xsd, и добавлял некоторые свойства, используя частичные классы. После сериализации json эти свойства были отмечены k_BackingField. Настройки JsonFormatter, упомянутые в других ответах, также помогли, но более простым было отметить частичный класс с атрибутом [JsonObject].
Ответ 8
Я использовал DataContractJsonSerializer
с классом из другой сборки, у которой был атрибут Serializable
. Выход содержал "k__BackingField". Исправлено удаление атрибута Serializable
(в другой сборке). Не знаю, почему.
Ответ 9
Предполагая, что вы видите эту проблему внутри своего проекта MVC, я обнаружил, что довольно просто заменить использование @Html.JsonData. Вот фрагмент кода, который работал у меня в прошлом:
<input type="hidden" id="Model" value="@Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model))" />
Не так элегантно, но просто в крайнем случае.
Ответ 10
У меня была эта проблема, когда у меня есть собственные свойства ссылки в моем классе, такие как:
class Person {
List<Person> Friends { get; set;}
}
И был результат, человек был другом с самим собой. Я просто убедился, что в моем результирующем наборе не было объектов саморегуляции. Надеюсь, это поможет.
Ответ 11
Мне пришлось использовать атрибуты [Serializable], поэтому удалить его было невозможно.
XmlSerializer игнорирует [XmlAttribute] в WebApi
Вышеуказанное решение решило это для меня.
GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
Ответ 12
в моем случае эта ошибка была для версии Newtonsoft.Json, сервер искал версию 6.0.0, а у меня была 11.0, поэтому мне пришлось установить версию 6.0.0
Ответ 13
Друзья, не объявляйте свойства следующим образом:
public String DiscretionCode { get; set; }
public String DiscretionDescription { get; set; }
Но создайте вспомогательные вары, как старые....
private String discretionCode;
public String DiscretionCode
{
get { return discretionCode;}
set { discretionCode = value; }
}