Как удалить 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; }
}