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