programing

시스템 기본 옵션을 글로벌하게 설정하는 방법.텍스트, Json.Json Serializer?

minecode 2023. 3. 26. 13:52
반응형

시스템 기본 옵션을 글로벌하게 설정하는 방법.텍스트, 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 。아니면 제가 간과하고 있는 건가요?


확장 메서드를 생성할 수 있습니다.여기 예가 있습니다.

모든 설정을 한 곳에서 쉽게 재사용할 수 있도록 특별한 설정을 구축해야 하는 경우와 다른 방법을 사용합니다.

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

반응형