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


103

.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 데이터 문자열에이 작업이 필요하며 시간을 절약 할 수 있는지 확인하고 있습니다. 키 생성에 소문자를 적용 할 수있는 이미 빌드 된 라이브러리가 있는지 궁금합니다.


아마도 json 직렬화 lib가 속성의 json 직렬화 이름을 변경하는 데 사용할 수있는 일종의 직렬화 속성을 제공할까요?
tdammers

@tdammers, 감사합니다 나는 그것을하는 것을 찾으려고 노력하고 있지만 지금까지는 실패했습니다. 여기 누군가가 나를 가리킬 수 있기를 바랍니다.
Mark

1
이것은 당신이 인적 또는 한 단어로 구성되어 경우에 유용 할 수 있습니다.
Lipotam

허. 저는 반대의 문제가 있습니다. 또한 "사용자 이름"이 대소 문자가 혼합되어 있다고 언급하는 것이 재밌습니다. "사용자 이름"을 의미 했습니까?
BrainSlugs83

단순히 대소 문자를 혼합하여 유지하는 데 필요한 값은 키만 내가 만져야하는 것이 었습니다. 가치는 그대로 두십시오.
Mark

답변:


176

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

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 라이브러리를 사용할 수 있습니다 .


이 작업을 반대로 수행하는 합리적인 방법이 있습니까? 역 직렬화를 위해?
Shaun Rowan 2012 년

1
@Anzeo 나는 직접 시도하지 않았으며 문서에서 그것에 대한 정보를 찾지 못했습니다. 해결책은 자신의 클래스에 JsonConvert.SerializeObject를 래핑하는 것입니다. 내 업데이트를 참조하십시오.
alexn

3
예외를 지정하려는 경우이 사용자 정의 contractresolver는 JsonProperty 속성을 고려하지 않는 것 같습니다. 예를 들어 [JsonProperty ( "alternateName")]은 여전히 ​​소문자로 표시되거나 다른 방법이 있습니까?
rekna

2
을 지적하는 +1 CamelCasePropertyNamesContractResolver. 이제 System.Net.Http.Formatting.JsonContractResolverWebAPI에서 기본값이 발견 되었으며이 클래스는 내부 클래스입니다. 나는 JsonContractResolver낙타 케이스 로 다시 작성 합니다. 사람이 할 수있는 공공보고 aspnetwebstack.codeplex.com/workitem/228
CallMeLaNN

10
CamelCasePropertyNamesContratResolver속성을 소문자로 변환하지 말고 첫 번째 문자 만 변환하십시오.
ToXinE

23
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();
    }
}

10

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

노트 -


8

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

0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.