System.Text.Json.JsonSerializer에 대한 기본 옵션을 전역 적으로 설정하는 방법은 무엇입니까?


12

업데이트 [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 직렬화 기본값을 관리하기위한 아날로그가없는 것 같습니다. 또는 간과합니까?


There doesn't seem to be an analog for managing JSON serialization defaults in Core-3-API 안팎의 요청에 대해 이야기하고 있습니까? 또는 다른 자원에 대한 요청 및 응답?
ps2goat

@ ps2goat 나는 당신의 질문을 이해하지 못합니다. 여기서 중요한 것은 JSON 문자열을 직렬화 해제하는 것입니다. 그들은 여러 출처에서 나올 수 있습니다.
Trevor Reid

입력 및 출력 포맷터 (예 : 모델 바인딩)를위한 시작시 특별한 위치가 있기 때문에 묻습니다.
ps2goat

아. 그런 의미에서 나는 우리의 사건이 "다른 자원"에 해당 될 것이라고 생각합니다. @ ps2goat
Trevor Reid

.net core 3.1까지는 여전히 내장 된 훌륭한 json serializer가 없었습니다.
농담 황

답변:


4

아니요, 기본 옵션을JsonSerializerOptions 공개하지 않습니다 . 특정 웹 프레임 워크를 사용하는 경우이를 통해 직렬화 해제 설정을 지정하는 방법이있을 수 있습니다. 그렇지 않으면 자신 만의 편리한 방법을 만드는 것이 좋습니다.

이 공개 된 문제 도 참조하십시오 .


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

아, 당신은 또 다른 Json.Net 의존 답변이라고 생각합니다. 이 질문은 System.Text.Json.JsonSerializer추가 종속성이없는 NET Core-3.0 의 문제입니다 . 감사.
Trevor Reid

2
이것이 추상화의 아름다움입니다. 이 확장 클래스 이외의 코드 변경은 없습니다! 방금 내장로 업데이트했습니다 System.Text.Json.JsonSerializer. 개념은 정확히 동일했습니다. 예제 링크도 업데이트했습니다.
ps2goat


2

해결 방법은 GitHub의 사용자에 의해 제안되었다 앙드레 - SS6 다음과 같다 :

((JsonSerializerOptions)typeof(JsonSerializerOptions)
    .GetField("s_defaultOptions", 
        System.Reflection.BindingFlags.Static |
        System.Reflection.BindingFlags.NonPublic).GetValue(null))
    .PropertyNameCaseInsensitive = true;

-1

(Json.NET을 사용하도록 전환 한 경우)

나는 명시 적이며 모든 호출에 설정을 전달하는 것을 선호하고 권장하지만 DefaultSettings로 기본값을 설정할 수 있습니다 .

JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;

그리고

var json = JsonConvert.SerializeObject(o1);
var o2 = JsonConvert.DeserializeObject(x);

@tymtam의 답변과 링크는 Json.Net에 적용됩니다. 이 질문 System.Text.Json은 JSON 직렬화가 .NET Core 3.0에 구워진 유사한 동작과 관련 이 있습니다. 답변 해 주셔서 감사합니다.
Trevor Reid
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.