Programing

.NET에서 json 키가 소문자인지 확인

lottogame 2020. 8. 26. 08:20
반응형

.NET에서 json 키가 소문자인지 확인


.NET에서 JSON을 사용하여 키가 소문자로 전송되도록하는 간단한 방법이 있습니까?

현재 저는 newtonsoft의 Json.NET 라이브러리를 사용하고 있습니다.

string loginRequest = JsonConvert.SerializeObject(auth);

이 경우 auth는 다음 개체입니다

public class Authority
{
    public string Username { get; set; }
    public string ApiToken { get; set; }
}

결과

{"Username":"Mark","ApiToken":"xyzABC1234"}

usernameapitoken키가 소문자로 표시 되도록하는 방법이 있습니까?

나는 단순히 통해 그것을 실행하지 않으 String.ToLower()에 대한 값 때문에 과정 username과이 apitoken혼합 된 경우이다.

프로그래밍 방식으로이 작업을 수행하고 JSON 문자열을 수동으로 만들 수 있다는 것을 알고 있지만 약 20 개 정도의 JSON 데이터 문자열에이 작업이 필요하며 시간을 절약 할 수 있는지 확인하고 있습니다. 키 생성에 소문자를 적용 할 수있는 이미 빌드 된 라이브러리가 있는지 궁금합니다.


이를 위해 사용자 지정 계약 해결자를 만들 수 있습니다. 다음 계약 해결 프로그램은 모든 키를 소문자로 변환합니다.

public class LowercaseContractResolver : DefaultContractResolver
{
    protected override string ResolvePropertyName(string propertyName)
    {
        return propertyName.ToLower();
    }
}

용법:

var settings = new JsonSerializerSettings();
settings.ContractResolver = new LowercaseContractResolver();
var json = JsonConvert.SerializeObject(authority, Formatting.Indented, settings);

Wil 결과 :

{"username":"Mark","apitoken":"xyzABC1234"}

항상을 사용하여 직렬화 LowercaseContractResolver하려면 자신을 반복하지 않도록 클래스로 래핑하는 것이 좋습니다 .

public class LowercaseJsonSerializer
{
    private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
    {
        ContractResolver = new LowercaseContractResolver()
    };

    public static string SerializeObject(object o)
    {
        return JsonConvert.SerializeObject(o, Formatting.Indented, Settings);
    }

    public class LowercaseContractResolver : DefaultContractResolver
    {
        protected override string ResolvePropertyName(string propertyName)
        {
            return propertyName.ToLower();
        }
    }
}

다음과 같이 사용할 수 있습니다.

var json = LowercaseJsonSerializer.SerializeObject(new { Foo = "bar" });
// { "foo": "bar" }

ASP.NET MVC4 / WebAPI

ASP.NET MVC4 / WebAPI를 사용하는 경우 CamelCasePropertyNamesContractResolver기본적으로 포함 된 Newtonsoft.Json 라이브러리를 사용할 수 있습니다 .


protected void Application_Start() {
    JsonConfig.Configure();   
}

public static class JsonConfig
{
    public static void Configure(){
        var formatters = GlobalConfiguration.Configuration.Formatters;
        var jsonFormatter = formatters.JsonFormatter;
        var settings = jsonFormatter.SerializerSettings;

        settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    }
}

In Json.NET 9.0.1 and later it is possible to ensure that all property names are converted to lowercase by using a custom NamingStrategy. This class extracts the logic for algorithmic remapping of property names from the contract resolver to a separate, lightweight object that can be set on DefaultContractResolver.NamingStrategy. Doing so avoids the need to create a custom ContractResolver and thus may be easier to integrate into frameworks that already have their own contract resolvers.

Define LowercaseNamingStrategy as follows:

public class LowercaseNamingStrategy : NamingStrategy
{
    protected override string ResolvePropertyName(string name)
    {
        return name.ToLowerInvariant();
    }
}

Then serialize as follows:

var settings = new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver { NamingStrategy = new LowercaseNamingStrategy() },
};
string loginRequest = JsonConvert.SerializeObject(auth, settings);

Notes -


you can use "JsonProperty":

Usage:

public class Authority
{
    [JsonProperty("userName")] // or [JsonProperty("username")]
    public string Username { get; set; }
    [JsonProperty("apiToken")] // or [JsonProperty("apitoken")]
    public string ApiToken { get; set; }
}

var json  = JsonConvert.SerializeObject(authority);

참고URL : https://stackoverflow.com/questions/6288660/ensuring-json-keys-are-lowercase-in-net

반응형