Json.net으로 직렬화 할 때 속성 이름을 어떻게 변경합니까?


434

C # DataSet 개체에 데이터가 있습니다. 이와 같은 Json.net 변환기를 사용하여 지금 직렬화 할 수 있습니다

DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);

그러나 data.json 파일로 인쇄 할 때 의 속성 이름을 사용 합니다. 속성 이름을 다른 것으로 변경하고 싶습니다 (예 : 'foo'를 'bar'로 변경).

에서 Json.net 문서 '직렬화 및 역 직렬화 JSON'에서, →는 "JsonPropertyAttribute이 ... 이름 사용자 정의 할 수 있습니다"라고 '직렬화 속성'. 그러나 예는 없습니다. 누구든지 JsonPropertyAttribute를 사용하여 속성 이름을 다른 것으로 변경하는 방법을 알고 있습니까?

( 문서에 직접 링크 )

Json.net의 문서는 드문 것 같습니다. 좋은 예가 있다면 공식 문서에 추가하려고 노력할 것입니다. 감사!


3
참고로 샘플-> 직렬화 JSON-> JsonPropertyAttribute 이름 의 문서에 이에 대한 예가 있습니다. 언제 추가되었는지 확실하지 않습니다.
Brian Rogers

답변:


791

이름을 제어하려는 [JsonProperty]속성을 다른 이름을 지정할 수 있는 속성으로 장식 할 수 있습니다 .

using Newtonsoft.Json;
// ...

[JsonProperty(PropertyName = "FooBar")]
public string Foo { get; set; }

설명서 : 직렬화 속성


1
이를 위해서는 DataSet이 아닌 내가 만든 사용자 지정 개체로 데이터를 읽어야합니까?
culix

3
@culix, 예, 모델을 사용해야합니다. DataSet은 약한 형식의 구조이므로 속성 이름에 대해 말하는 것은 그리 논리적이지 않습니다.
Darin Dimitrov 2019 년

76
속기, 당신도 할 수 있습니다[JsonProperty("FooBar")]
Bart Verkoeijen

2
@DarinDimitrov Json .NET없이 이것을 할 수있는 방법이 있습니까?
CH81

12
모델을 사용하는 것은 쉽지만 JSON 샘플을 가져 와서 "Paste Special"-> "Paste JSON as Classes"를 사용하여 빈 .cs 파일에 붙여 넣으십시오. -Visual Studio에 내장되어 있습니다. -거기서부터 기본적으로 제목 케이스로 설정하고 .NET 이름 지정 규칙 등을 사용하기 위해 이름을 바꾸는 것만 필요합니다 (전자의 제목 케이스 변환기 및 후자의 경우 JsonProperty 속성 사용).
BrainSlugs83

71

속성을 변경하기 위해 클래스에 액세스 할 수 없거나 항상 동일한 이름 바꾸기 속성을 사용하지 않으려는 경우 사용자 지정 해결 프로그램을 만들어 이름을 바꿀 수도 있습니다.

예를 들어,이라는 MyCustomObject속성이있는 이라는 클래스가있는 경우 다음 LongPropertyName과 같은 사용자 지정 해결 프로그램을 사용할 수 있습니다.

public class CustomDataContractResolver : DefaultContractResolver
{
  public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();

  protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
  {
    var property = base.CreateProperty(member, memberSerialization);
    if (property.DeclaringType == typeof(MyCustomObject))
    {
      if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase))
      {
        property.PropertyName = "Short";
      }
    }
    return property;
  }
}

그런 다음 직렬화를 요청하고 리졸버를 제공하십시오.

 var result = JsonConvert.SerializeObject(myCustomObjectInstance,
                new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });

결과는 { "LongPropertyName": "prop value"} 대신 { "Short": "prop value"} 로 단축됩니다 .

여기 에서 커스텀 리졸버에 대한 자세한 정보


1
직렬화 할 클래스가 다른 버전의 Newtonsoft.Json 패키지를 포함하는 다른 어셈블리에서 선언 된 경우 더 나은 솔루션입니다. (오류가 발생하지 않을 수도 있음). 는 DefaultContractResolverJsonConvert.Serialize () 메소드를 사용하는 동일한 어셈블리에 배치되어야한다.
Artemious

6

특정 사용을 할 수있는 또 다른 방법, 여전히이 의 NamingStrategy 로 장식하여 클래스 나 속성에 적용 할 수있는, [JSonObject]또는 [JsonProperty].

와 같은 사전 정의 된 이름 지정 전략이 CamelCaseNamingStrategy있지만 자체 전략 을 구현할 수 있습니다.

다른 이름 지정 전략의 구현은 여기에서 찾을 수 있습니다. https://github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serialization


3
가능하다면 커스텀 NamingStrategy 구현의 예를 공유하십시오
user1007074

당연히 아니지. 직접 작성해야하지만, 단순히 newtonsoft.com/json/help/html/ 을 상속해야한다고 말할 시간을 아끼지 않을 것입니다 . 기존 클래스 구현을보고 자신 만의 클래스를 만들 수 있습니다.
JotaBe

감사합니다 - 난 내 댓글을 업데이트해야 : 사실, GitHub에있는 영광 덕분에, 하나의 예로서, 말, Newtonsoft 자신의 구현 중 하나를 사용할 수 있습니다 이 한
user1007074

8
@JotaBe, 그것은 stackoverflow의 정신이 아닙니다. 솔직히 내 일을 끝내고 싶은 프로그래머로서, 내가 제공 한 코드를 들어 올리는 것이 수천 배나 나을 것입니다. 그리고 당신은 내 투표도 받았을 것입니다. 저는 18 년의 코딩 경험이 있으며 TripleByte에 의해 C #에서 "전문가"로 선정되었습니다. 모든 문제를 "독자 운동"으로 남겨 둘 필요는 없습니다. 때때로 우리는 단지 일을하고 계속 나아가기를 원합니다.
bboyle1234

2
나는 당신에게 동의하며, 나는 보통 이런 종류의 의견을 쓰지 않습니다. 그러나이 경우 연결된 코드를 보는 것이 내가 설명 할 수있는 것보다 낫다는 것을 확신 할 수 있습니다. 그리고 json.net은 매우 잘 문서화 된 오픈 소스 라이브러리입니다. 구현에 대한 링크 포함 (완전한 예)
JotaBe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.