web-dev-qa-db-ja.com

System.Text.Json.JsonSerializerのデフォルトオプションをグローバルに設定する方法

UPDATE [2019-12-23]:一部ボーカルによる コミュニティの入力 この問題 ロードマップに追加されました for .NET 5.0。

UPDATE [2019-10-10]:この動作がSystem.Text.Json.JsonSerializer先に進む未解決のGitHubの問題 =Chris 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のインスタンスを渡さずに、ルールではなく例外をオーバーライドすることです。

this q&a に示されているように、これはJson.Netの便利な機能です。 System.Text.Jsonの-​​ ドキュメント と.NET Coreの このGitHubリポジトリ を調べました。そして これ

.NET Core 3でJSONシリアル化のデフォルトを管理するための類似物はないようです。または、見落としているのですか?

11
Trevor Reid

いいえ、JsonSerializerOptionsデフォルトオプション を公開しません。特定のWebフレームワークを使用している場合、それを介して(逆)シリアル化設定を指定する方法があるかもしれません。それ以外の場合は、独自の便利なメソッドを作成することをお勧めします。

この未解決の問題 も参照してください。

4
Chris Yungmann

拡張メソッドを作成できます。 ここに例があります

私は特別な設定を構築する必要があるのとは別の方法を使用するので、すべての設定が1つの場所にあり、簡単に再利用できます。

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

.NET Core 3.1のJsonSerializerでは、デフォルトのオプションは公開されていません。ただし、2019年12月の時点で、これは ロードマップに追加 5.0です。

.NET 5.0のリリースは 予定 2020年11月です。ただし、この特定の問題が特定の時点で解決される保証はありません。待つ以外に、これらの回答は回避策を提案します:

2
Trevor Reid

回避策 は、GitHubユーザー andre-ss6 によって次のように提案されています。

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