programing

JSON 직렬화에서 속성 이름의 기본 대소문자

codeshow 2023. 3. 18. 09:09
반응형

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);

새로운(9.0.1 이후)를 사용하는 것이 좋습니다.

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

반응형