如何全局设置System.Text.Json.JsonSerializer的默认选项?


12

更新[2019-12-23]: 部分由于声音社区的投入,此问题已添加到 .NET 5.0 的路线图中。

更新[2019-10-10]: 如果有兴趣看到针对System.Text.Json.JsonSerializer继续阅读Chris Yungmann指出的GitHub公开问题,并发表意见


代替这个:

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在我们最常见的情况下传递的实例,而对异常(而不是规则)进行覆盖。

问答中所述,这是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 core 3.1为止,仍然没有一个好的内置json序列化程序。
开玩笑黄

Answers:



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.JsonSerializerNET Core-3.0中没有附加依赖项的。谢谢。
Trevor Reid

2
那就是抽象的美。在此扩展类之外,没有任何代码更改!我刚刚更新到内置的System.Text.Json.JsonSerializer。这个概念是完全一样的。我也更新了示例链接。
ps2goat


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。这个问题与simialr行为有关System.Text.Json,JSON序列化已嵌入到.NET Core 3.0中。感谢您抽出宝贵的时间来回复。
特雷弗·里德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.