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の便利な機能です。私はに見えたドキュメントのためSystem.Text.Jsonだけでなく、このGitHubのレポ .NETのコアのために。そしてこれ

.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コア3.1までは、優れた組み込みのjsonシリアライザーはまだありませんでした。
ジョーク・ファン

回答:



3

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

特別な設定を構築する必要があるのとは別の方法を使用するので、すべての設定が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>();

ああ、あなたの答えはJson.Netに依存する別の答えだと思います。この質問は、System.Text.Json.JsonSerializer追加の依存関係がないNET Core-3.0 に関するものです。ありがとう。
Trevor Reid、

2
それが抽象化の美点です。この拡張機能クラス以外のコードは変更されません。ビルトインにアップデートしましたSystem.Text.Json.JsonSerializer。コンセプトはまったく同じでした。サンプルリンクも更新しました。
ps2goat

3

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

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


2

GitHubユーザーandre-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は、.NET Core 3.0に組み込まれたJSONシリアル化である同様の動作に関係しています。お返事をいただきありがとうございます。
Trevor Reid、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.