programing

역직렬화 시 json에서 k__BackingField를 삭제하는 방법

oldcodes 2023. 3. 25. 11:53
반응형

역직렬화 시 json에서 k__BackingField를 삭제하는 방법

xml 파일을 .net c# 객체에 시리얼화한 후 반환된 json에 k_BackingField가 표시됩니다.

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"

제거한다.[Serializable]당신의 반에서

기본 WebApi 시리얼라이저는 c# 자동속성에 _BackingField: 구문을 추가합니다.App_Start의 WebConfig에 이 기능을 추가하면 찾고 있는 보다 깨끗한 json을 얻을 수 있습니다.

using Newtonsoft.Json;
...

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

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

이 경우 Data Member Atribute를 적용하면 문제가 해결될 것입니다.그러나 클래스를 시리얼라이제이션에 사용해야 하는 경우 풀 속성 구문을 사용하는 것이 좋습니다.

다음과 같이 표시된 객체가 있습니다.[Serializable]기존 방법으로 시리얼화 할 수 있지만 웹 API에서 사용하기 위해서는 JSON에서 깔끔하게 시리얼화해야 합니다.설정IgnoreSerializableAttribute로.true뉴턴소프트를 막을 거야Json은 마이크로소프트의 시리얼라이저처럼 동작하지 않고 대신 공공재산을 시리얼화합니다.

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]아트리뷰트

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

는 용 i i용었 i i i i i 。DataContractJsonSerializer다른 의회의 학급과 함께요Serializable가 포함되어 있습니다."k__Backing Field" 입니다.의 삭제Serializable아트리뷰트이유는 잘 모르겠어요.

MVC 프로젝트 내에서 이 문제를 볼 수 있다면 @Html을 대체하는 것은 매우 간단하다는 것을 알게 되었습니다.Json Data.다음은 과거에 나에게 효과가 있었던 코드의 일부입니다.

<input type="hidden" id="Model" value="@Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model))" />

우아한 느낌은 아니지만, 만일의 경우 심플합니다.

수업 중에 다음과 같은 자기 참조 속성이 있을 때 이 문제가 발생했습니다.

class Person {
 List<Person> Friends { get; set;}
}

그리고 그 결과, 그 사람은 자신과 친구가 되었다.결과 세트에 자기 참조 개체가 없는지 확인했습니다.이게 도움이 됐으면 좋겠다.

[Serializable] 속성을 사용해야 했기 때문에 삭제할 수 없었습니다.

XmlSerializer가 WebApi에서 [XmlAttribute]를 무시함

위의 각오로 해결했습니다.

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

제 경우엔 이 오류가 뉴턴소프트 때문이었어요서버가 6.0.0 버전을 찾았고 11.0을 가지고 있었기 때문에 6.0.0 버전을 설치해야 했습니다.

친구여, 재산을 이렇게 신고하지 마십시오.

public String DiscretionCode { get; set; }
public String DiscretionDescription { get; set; }

하지만, 예전처럼 보조 대표팀을 만듭니다...

private String discretionCode;

public String DiscretionCode 
{ 
    get { return discretionCode;}
    set { discretionCode = value; }
}

언급URL : https://stackoverflow.com/questions/13022198/how-to-remove-k-backingfield-from-json-when-deserialize

반응형