[.net] .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();
    }
}


답변

Json.NET 9.0.1 이상 에서는 사용자 지정 .NET Framework 를 사용하여 모든 속성 이름이 소문자로 변환되도록 할 수 있습니다 NamingStrategy. 이 클래스는 계약 확인자에서 속성 이름을에서 설정할 수있는 별도의 경량 개체로 알고리즘 방식으로 다시 매핑하기위한 논리를 추출합니다 DefaultContractResolver.NamingStrategy. 이렇게하면 사용자 지정ContractResolver 을 만들 필요가 없으므로 이미 자체 계약 해결 프로그램이있는 프레임 워크에 더 쉽게 통합 할 수 있습니다.

LowercaseNamingStrategy다음과 같이 정의하십시오 .

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

그런 다음 다음과 같이 직렬화합니다.

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

노트 –


답변

“JsonProperty”를 사용할 수 있습니다.

용법:

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


답변

나를 위해 나는 다른 답변의 조합을 사용했고 결국 이것으로 끝났습니다.

        return JsonConvert.SerializeObject(obj, Formatting.Indented, new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver()
        });

내 자신을 만들려고하지 않았기 때문에 내가 찾던 것에 대한 해결책에 더 가깝습니다.


답변