[.net] Deserialize 할 때 json에서 k__BackingField를 제거하는 방법

xml 파일을 .net C # 개체로 직렬화 한 후 반환 된 json에서 k_BackingField를 얻습니다.

.net C # 개체에 DataContract 및 DataMember 특성을 추가했지만 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"



답변

클래스를 직렬화에 사용할 수있는 경우 자동 속성 구문은 실제로 권장되지 않습니다. 백업 필드가되는 이유는 코드가 컴파일 될 때마다 다를 수있는 컴파일러에 의해 생성됩니다. 이로 인해 클래스가 변경되지 않은 경우에도 비 호환성 문제가 발생할 수 있습니다 (코드를 다시 컴파일하기 만하면 됨).

이 경우 DataMember 속성을 적용하면 문제가 해결 될 것이라고 생각합니다. 그러나 클래스를 직렬화에 사용해야하는 경우 전체 속성 구문을 사용하는 것이 좋습니다.


답변

[Serializable]수업에서 제거


답변

기본 WebApi serializer는 “__BackingField :”구문을 c # 자동 속성에 추가합니다. App_Start의 WebConfig에 이것을 추가하여 찾고있을 수있는 깔끔한 json을 얻으십시오.

using Newtonsoft.Json;
...

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


답변

[Serializable]전통적인 방법을 사용하여 직렬화 할 수 있도록 표시된 일부 객체가 있지만 Web API와 함께 사용하려면 JSON으로 명확하게 직렬화해야합니다. 로 설정 IgnoreSerializableAttribute하면 trueNewtonsoft.Json이 Microsoft의 직렬화 기처럼 작동하지 않고 대신 공용 속성을 직렬화합니다.

TLDR : WebApiConfig.cs에 다음을 추가하십시오.

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

중재자 : 여러 번 질문 한 질문에 대해 정말 좋은 답변을 삭제하는 대신 중복 질문을 삭제하십시오. 이것은 유효한 질문에 대한 유효한 대답입니다.


답변

데이터를 노출하는 간단하고 쉬운 방법
우리는 객체의 데이터를 읽기 쉽고 일관된 형식으로 노출해야합니다.

먼저 [Serializable] 제거

    [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] 속성으로 클래스를 표시하는 것으로 충분할 수 있습니다.

xsd에서 빌드 된 cs 클래스로 작업 중이었고 부분 클래스를 사용하여 일부 속성을 추가했습니다. json 직렬화 후 이러한 속성은 k_BackingField로 표시되었습니다. 다른 답변에서 언급 한 JsonFormatter 설정도 도움이되었지만 더 간단하게 부분 클래스를 [JsonObject] 속성으로 표시했습니다.