JSON 직렬화에서 속성 이름의 기본 대소문자
언젠가 JSON으로 시리얼화될 클래스가 많이 있습니다.백엔드의 C# 표기법과 프런트엔드의 JavaScript 표기법을 모두 따르기 위해 다음과 같은 속성을 정의하고 있습니다.
[JsonProperty(PropertyName="myFoo")]
public int MyFoo { get; set; }
C#에서는 다음 작업을 수행할 수 있습니다.
MyFoo = 10;
Javascript에서는 다음을 할 수 있습니다.
if (myFoo === 10)
하지만 모든 재산에 대해 이것을 하는 것은 지루하다.기본 JSON 방식을 빠르고 쉽게 설정할 수 있는 방법이 있습니까?별도의 지시가 없는 한 자동으로 대소문자가 표시되도록 Net이 속성 이름을 처리합니다.
제공된 클래스 Newtonsoft를 사용할 수 있습니다.Json. 시리얼화.Camel Case Property Names Contract Resolver:
var serializer = new JsonSerializer
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var jobj = JObject.FromObject(request, serializer);
즉, 커스텀 리졸버를 직접 작성할 필요가 없습니다.
개체를 직렬화할 때 몇 가지 사용자 지정 설정을 전달합니다.
var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var json = JsonConvert.SerializeObject(yourObject, settings);
new JsonSerializerSettings()
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = new CamelCaseNamingStrategy()
}
};
다음에 의해 설정된 커스텀명은 덮어쓰지 않습니다.JsonPropert('Name')
디폴트로는 (동작을 변경할 수 있습니다)CamelCaseNamingStrategy(bool, bool)
ctor). 따라서 @Matt Burland의 답변과 같은 커스텀클래스를 만들 필요가 없습니다.
JObject.FromObject
에서 기본 설정을 사용합니다.JsonConvert
디폴트입니다.다음과 같이 할당할 수 있는 펑크 속성이 있습니다.
JsonConvert.DefaultSettings = () => new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
전화할 때마다Jobject.FromObject
이 기능을 사용하여 설정을 구성합니다.
접수된 답변은 링크 전용이므로 실제 사용하게 된 코드를 추가합니다(링크가 끊어질 경우).링크와 거의 동일합니다.
// Automatic camel casing because I'm bored of putting [JsonProperty] on everything
// See: http://harald-muehlhoff.de/post/2013/05/10/Automatic-camelCase-naming-with-JsonNET-and-Microsoft-Web-API.aspx#.Uv43fvldWCl
public class CamelCase : CamelCasePropertyNamesContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member,
MemberSerialization memberSerialization)
{
var res = base.CreateProperty(member, memberSerialization);
var attrs = member.GetCustomAttributes(typeof(JsonPropertyAttribute), true);
if (attrs.Any())
{
var attr = (attrs[0] as JsonPropertyAttribute);
if (res.PropertyName != null && attr.PropertyName != null)
res.PropertyName = attr.PropertyName;
}
return res;
}
}
내가 한 유일한 변경은 의 추가였다.attr.PropertyName != null
예를 들어 다음과 같은 것을 추가했기 때문에 if 절로 이동합니다.
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string SomeProperty { get; set; }
또, 다음의 항목을 지정하고 싶지 않았습니다.PropertyName
(따라서 무효입니다).위의 내용은 JSON에서 다음과 같이 시리얼화됩니다.someProperty
.
사용자 정의 계약 해결 프로그램을 사용할 수 있습니다.
class MyContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var properties = base.CreateProperties(type, memberSerialization);
foreach (var property in properties)
{
property.PropertyName = char.ToLower(property.PropertyName[0]) + string.Join("", property.PropertyName.Skip(1));
}
return properties;
}
}
사용법은 다음과 같습니다.
class MyClass
{
public int MyProperty { get; set; }
public int MyProperty2 { get; set; }
}
var json = JsonConvert.SerializeObject(new MyClass(),
Formatting.Indented,
new JsonSerializerSettings { ContractResolver = new MyContractResolver() });
.NET 5.0에서는 시스템을 사용할 수 있습니다.Text.Json 및 JsonSerializerOptions 내의 PropertyNamingPolicy 지정
System.Text.Json.Json Serializer 옵션속성 명명 정책
다음은 camel 케이스를 사용하도록 속성을 설정하는 Microsoft 문서 페이지 링크입니다.
var serializeOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, serializeOptions);
학급
public class WeatherForecastWithPropertyNameAttribute
{
public DateTimeOffset Date { get; set; }
public int TemperatureCelsius { get; set; }
public string Summary { get; set; }
[JsonPropertyName("Wind")]
public int WindSpeed { get; set; }
}
JSON 출력
{
"date": "2019-08-01T00:00:00-07:00",
"temperatureCelsius": 25,
"summary": "Hot",
"Wind": 35
}
public static JsonSerializer FormattingData()
{
var jsonSerializersettings = new JsonSerializer {
ContractResolver = new CamelCasePropertyNamesContractResolver() };
return jsonSerializersettings;
}
public static JObject CamelCaseData(JObject jObject)
{
var expandoConverter = new ExpandoObjectConverter();
dynamic camelCaseData =
JsonConvert.DeserializeObject(jObject.ToString(),
expandoConverter);
return JObject.FromObject(camelCaseData, FormattingData());
}
언급URL : https://stackoverflow.com/questions/21783137/default-camel-case-of-property-names-in-json-serialization
'programing' 카테고리의 다른 글
React 상태에서 Set 데이터 구조 사용 (0) | 2023.03.18 |
---|---|
Meteor 앱 - 배포된 앱의 DB 리셋 (0) | 2023.03.18 |
잔가지/시간 표시자 테마에서 사용자 정의 자리 표시자 이미지 설정 (0) | 2023.03.18 |
네이티브 텍스트가 내 화면에서 지워지고 포장을 거부합니다.무엇을 해야 하나? (0) | 2023.03.18 |
jQuery: Ajax를 통해 모달 대화 상자 내용 로드 (0) | 2023.03.18 |