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

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의 문서는 드문 것 같습니다. 좋은 예가 있다면 공식 문서에 추가하려고 노력할 것입니다. 감사!



답변

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

using Newtonsoft.Json;
// ...

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

설명서 : 직렬화 속성


답변

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

예를 들어,이라는 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”} 로 단축됩니다 .

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


답변

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

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

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


답변