시스템 기본 옵션을 글로벌하게 설정하는 방법.텍스트, Json.Json Serializer?
이것 대신:
JsonSerializerOptions options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
// etc.
};
var so = JsonSerializer.Deserialize<SomeObject>(someJsonString, options);
저는 다음과 같은 것을 하고 싶습니다.
// This property is a pleasant fiction
JsonSerializer.DefaultSettings = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
// etc.
};
// This uses my options
var soA = JsonSerializer.Deserialize<SomeObject>(someJsonString);
// And somewhere else in the same codebase...
// This also uses my options
var soB = JsonSerializer.Deserialize<SomeOtherObject>(someOtherJsonString);
희망은 의 예를 통과하지 않아도 되는 것이다.JsonSerializerOptions
규칙이 아닌 예외에 대해 덮어씁니다.
이 Q&A에서 알 수 있듯이 이것은 Json의 유용한 기능입니다.네, 서류에서 찾아봤는데System.Text.Json
그리고 이 GitHub repo for.NET 코어그리고 이건.
에는 JSON 시리얼라이제이션의 디폴트를 관리하는 아날로그가 없는 것 같습니다.NET Core 3 (NET Core 3 。아니면 제가 간과하고 있는 건가요?
업데이트 [2020-07-18]: 디폴트 설정에 준거한 편리한 방법을 사용하는 nuget 패키지에 대해서는, 이 회답을 참조해 주세요.
업데이트 [2019-12-23]: 음성 커뮤니티의 입력에 따라 이 문제는 의 로드맵에 추가되었습니다.NET 5.0.
업데이트 [2019-10-10]: 만약 Chris Yungmann이 지적한 오픈 GitHub 문제를 정면으로 검토하기 위해 이 동작이 구현되는 것을 보고 싶다면.
확장 메서드를 생성할 수 있습니다.여기 예가 있습니다.
모든 설정을 한 곳에서 쉽게 재사용할 수 있도록 특별한 설정을 구축해야 하는 경우와 다른 방법을 사용합니다.
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>();
아니요.JsonSerializerOptions
에서는 디폴트옵션은 공개되지 않습니다.특정 웹 프레임워크를 사용하는 경우 이를 통해 (비직렬화) 설정을 지정할 수 있습니다.그렇지 않다면, 나는 당신만의 편리한 방법을 만들 것을 제안합니다.
이 미해결 문제도 참조해 주세요.
StartUp에서 저는 이게 잘 될 것 같아요.서비스 구성:
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
options.JsonSerializerOptions.PropertyNamingPolicy=JsonNamingPolicy.CamelCase;
});
GitHub 사용자 adre-ss6에 의해 다음과 같은 회피책이 제안되었습니다.
((JsonSerializerOptions)typeof(JsonSerializerOptions)
.GetField("s_defaultOptions",
System.Reflection.BindingFlags.Static |
System.Reflection.BindingFlags.NonPublic).GetValue(null))
.PropertyNameCaseInsensitive = true;
기본 옵션은 에 표시되지 않습니다.JsonSerializer
.NET Core 3.1의 경우.그러나 2019년 12월 현재 5.0 로드맵에 추가되었다.
의 릴리스.NET 5.0은 2020년 11월에 예정되어 있습니다.그러나 이 특정 문제가 언제든지 해결될 것이라는 보장은 없습니다.대기 외에 다음 답변은 회피책을 제시합니다.
또, @ps2backs의 회답에서 영감을 얻어 편리 확장 방법을 패키지화하여 nuget.org과 github에 올렸습니다.
일부 필드는 시작 시 자동 속성이 되었습니다.NET7. 따라서 위의 답변에서 @Trevor Reid로 변경할 방법은 없습니다.
새로운 접근법은 개인 필드를 직접 변경하는 것입니다.
public static void SetIgnoreNulls() => typeof(JsonSerializerOptions).GetRuntimeFields()
.Single(f => f.Name == "_defaultIgnoreCondition")
.SetValue(JsonSerializerOptions.Default, JsonIgnoreCondition.WhenWritingNull);
★★★★GetRuntimeFields().Single()
만 아니라GetRuntimeField(%name%)
답변은 이쪽입니다.https://github.com/dotnet/runtime/issues/15643
(Json 사용으로 전환한 경우).네트워크)
명시적이고 모든 콜에 설정을 전달하는 것이 좋지만 Default Settings를 사용하여 기본값을 설정할 수 있습니다.
JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;
그리고 나서.
var json = JsonConvert.SerializeObject(o1);
var o2 = JsonConvert.DeserializeObject(x);
언급URL : https://stackoverflow.com/questions/58331479/how-to-globally-set-default-options-for-system-text-json-jsonserializer
'programing' 카테고리의 다른 글
전달할 헤더 매개 변수가 있는 Img src 경로 (0) | 2023.03.26 |
---|---|
스프링 부트 - Application.properties의 커스텀 변수 (0) | 2023.03.26 |
AngularJS 컨트롤러 상속 (0) | 2023.03.26 |
ODATA에서 json 형식을 반환하는 방법 (0) | 2023.03.26 |
데이터 객체 배열을 json으로 변환 - Android (0) | 2023.03.26 |