[c#] System.Text.Json.JsonSerializer에 대한 기본 옵션을 전역 적으로 설정하는 방법은 무엇입니까?
업데이트 [2019-12-23] : 부분적으로 음성 커뮤니티 입력 으로 인해이 문제는 .NET 5.0 로드맵 에 추가 되었습니다 .
업데이트 [2019-10-10] : 이 동작이 구현되는 것을보고 싶다면System.Text.Json.JsonSerializer
에 이상에 머리를 오픈 GitHub의 문제 로 지적 크리스 Yungmann 와의 무게.
이 대신에 :
JsonSerializerOptions options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
// etc.
};
JsonSerializer.Deserialize<SomeObject>(someJsonString, options);
나는 이런 식으로하고 싶다 :
// This property is a pleasant fiction
JsonSerializer.DefaultSettings = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
// etc.
};
// This uses my options
JsonSerializer.Deserialize<SomeObject>(someJsonString);
// And somewhere else in the same codebase...
// This also uses my options
JsonSerializer.Deserialize<SomeOtherObject>(someOtherJsonString);
JsonSerializerOptions
가장 일반적인 경우 에 대한 인스턴스를 전달하지 않아도되고 규칙이 아닌 예외에 대해서는 무시 하지 않기를 바랍니다 .
이 q & a에 표시된 것처럼 이것은 Json.Net의 유용한 기능입니다. .NET Core 용 GitHub 리포지토리 뿐만 아니라 설명서 를 살펴 보았습니다 . 그리고 이것 .System.Text.Json
.NET Core 3에서 JSON 직렬화 기본값을 관리하기위한 아날로그가없는 것 같습니다. 또는 간과합니까?
답변
아니요, 기본 옵션을JsonSerializerOptions
공개하지 않습니다 . 특정 웹 프레임 워크를 사용하는 경우이를 통해 직렬화 해제 설정을 지정하는 방법이있을 수 있습니다. 그렇지 않으면 자신 만의 편리한 방법을 만드는 것이 좋습니다.
이 공개 된 문제 도 참조하십시오 .
답변
확장 방법을 만들 수 있습니다. 여기에 예가 있습니다
별도의 방법을 사용하고 특수 설정을 작성해야하므로 모든 설정이 단일 지점에 있고 쉽게 재사용 할 수 있습니다.
public static class DeserializeExtensions
{
private static JsonSerializerOptions defaultSerializerSettings = new JsonSerializerOptions();
// set this up how you need to!
private static JsonSerializerOptions featureXSerializerSettings = new JsonSerializerOptions();
public static T Deserialize<T>(this string json)
{
return JsonSerializer.Deserialize<T>(json, defaultSerializerSettings);
}
public static T DeserializeCustom<T>(this string json, JsonSerializerOptions settings)
{
return JsonSerializer.Deserialize<T>(json, settings);
}
public static T DeserializeFeatureX<T>(this string json)
{
return JsonSerializer.Deserialize<T>(json, featureXSerializerSettings);
}
}
그런 다음 리터럴이든 변수이든 문자열에서 메소드로 호출합니다.
Car result = @"{""Wheels"": 4, ""Doors"": 2}".DeserializeFeatureX<Car>();
답변
JsonSerializer
.NET Core 3.1 에는 기본 옵션이 표시되지 않습니다 . 그러나 2019 년 12 월 현재 5.0 의 로드맵 에 추가 되었습니다 .
.NET 5.0의 출시가되는 것으로 11 월 2020 그러나이 특정 문제가 특정 시간에 해결 될 것입니다 보장은 없습니다. 대기 이외의 해결 방법은 다음과 같습니다.
답변
해결 방법은 GitHub의 사용자에 의해 제안되었다 앙드레 – SS6 다음과 같다 :
((JsonSerializerOptions)typeof(JsonSerializerOptions)
.GetField("s_defaultOptions",
System.Reflection.BindingFlags.Static |
System.Reflection.BindingFlags.NonPublic).GetValue(null))
.PropertyNameCaseInsensitive = true;
답변
(Json.NET을 사용하도록 전환 한 경우)
나는 명시 적이며 모든 호출에 설정을 전달하는 것을 선호하고 권장하지만 DefaultSettings로 기본값을 설정할 수 있습니다 .
JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;
그리고
var json = JsonConvert.SerializeObject(o1);
var o2 = JsonConvert.DeserializeObject(x);