.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"}
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);
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);
노트 –
-
를 사용
string.ToLowerInvariant()
하면 모든 로케일에서 동일한 계약이 생성됩니다. -
재정의 된 속성 이름, 사전 키 및 확장 데이터 이름이 소문자인지 여부를 제어하려면
NamingStrategy.OverrideSpecifiedNames
,NamingStrategy.ProcessDictionaryKeys
또는NamingStrategy.ProcessExtensionDataNames
(Json.NET 10.0.1 이상)을true
. -
최상의 성능을 위해 계약 해결 프로그램 을 캐시 할 수 있습니다. .
-
프레임 워크의 serializer 설정에 액세스 할 수없는 경우
NamingStrategy
다음과 같이 객체에 직접을 적용 할 수 있습니다 .[JsonObject(NamingStrategyType = typeof(LowercaseNamingStrategy))] public class Authority { public string Username { get; set; } public string ApiToken { get; set; } }
-
을 수정하지 마십시오
NamingStrategy
의CamelCasePropertyNamesContractResolver
. 이 계약 해결 프로그램은 모든 인스턴스에서 전역 적으로 유형 정보를 공유하므로 하나의 인스턴스를 수정하면 예기치 않은 부작용이 발생할 수 있습니다.
답변
“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()
});
내 자신을 만들려고하지 않았기 때문에 내가 찾던 것에 대한 해결책에 더 가깝습니다.