programing

에서 json 키가 소문자임을 확인합니다.그물

javajsp 2023. 2. 28. 23:14

에서 json 키가 소문자임을 확인합니다.그물

에 JSON을 사용하는 간단한 방법이 있습니까?키가 소문자로 전송되도록 하려면 , NET 를 선택합니다.

지금은 뉴턴소프트의 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"}

이 모든 것을 확실하게 할 수 있는 방법이 있나요?username그리고.apitoken키는 소문자로 제공됩니까?

나는 단순히 그것을 훑어보고 싶지 않다.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);

결과는 다음과 같습니다.

{"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뉴턴소프트에서요.기본적으로 포함된 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();
    }
}

인제이슨.NET 9.0.1 이후에는 커스텀을 사용하여 모든 속성 이름을 소문자로 변환할 수 있습니다.이 클래스는 기본 계약 해상도를 추출하여 기본 계약 결심에서 설정할 수 있는 경량 개체 이름을 추출합니다.전략 이름 지정따라서 사용자 정의 계약서를 만들 필요가 있으며 이미 자체 계약 결의안을 작성해야 하며 이미 자체 계약 결의안을 가진 프레임 워크로 통합할 수 있습니다.

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

비고 -

  • 를 사용하면 모든 로케일에서 동일한 계약이 생성됩니다.

  • 재정의된 속성 이름, 사전 키 및 확장 데이터 이름의 소문자 여부를 제어하려면 , 또는 (Json)을 설정할 수 있습니다.NET 10.0.1 이후) ~true.

  • 최상의 성능을 위해 계약 해결 프로그램을 캐시할있습니다.

  • 할 수 없는 는, 「」를 할 수 .NamingStrategy다음과 같이 오브젝트에 직접 접속합니다.

    [JsonObject(NamingStrategyType = typeof(LowercaseNamingStrategy))]
    public class Authority
    {
        public string Username { get; set; }
        public string ApiToken { get; set; }
    }
    
  • 「」는 .NamingStrategy이 계약 해결사는 모든 인스턴스에서 유형 정보를 글로벌하게 공유하기 때문에 하나의 인스턴스를 변경하면 예기치 않은 부작용이 발생할 수 있습니다.

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

내가 찾던 것에 대한 해결책에 가까웠다. 왜냐하면 나는 내 자신의 것을 만들려는 것이 아니었기 때문이다.

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