[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);


답변