Как удалить 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"
614   11  

11 ответов:

синтаксис автоматического свойства на самом деле не рекомендуется, если класс может быть использован в сериализации. Причина в том, что резервное поле генерируется компилятором, который может быть разным каждый раз, когда код компилируется. Это может вызвать проблемы несовместимости, даже если в класс не вносится никаких изменений (просто перекомпиляция кода).

Я думаю, что применение атрибута DataMember устранит проблему в этом случае. Но я бы рекомендовал использовать полный синтаксис свойств, если класс должен использоваться в сериализация.

удалить [Serializable] класс

по умолчанию сериализатор веб-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; }
}

надеюсь, что это поможет
спасибо.

два варианта:

  1. удалить [Serializable] модели

  2. добавить [DataContract] и [DataMember] в вашей модели вместе с [Serializable]

  3. добавить ниже строки App_Start/WebApiConfig.cs

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

другое решение, которое может помочь в случае JSON.NET. возможно, достаточно отметить класс с помощью [Newtonsoft.формат JSON.Атрибут JsonObject].

Я работал с классами cs, построенными из xsd, и добавлял некоторые свойства, используя частичные классы. После сериализации json эти свойства были отмечены символом k_BackingField. Настройки JsonFormatter, упомянутые в других ответах, также помогли, но более простым было отметить частичный класс с атрибутом [JsonObject].

Я был с помощью DataContractJsonSerializer с классом из другой сборки, что имел

предполагая, что вы видите эту проблему внутри вашего проекта 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

    Ничего не найдено.