51

而不是这个:

JsonSerializerOptions options = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};
var so = JsonSerializer.Deserialize<SomeObject>(someJsonString, options);

我想做这样的事情:

// This property is a pleasant fiction
JsonSerializer.DefaultSettings = new JsonSerializerOptions
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    // etc.
};

// This uses my options
var soA = JsonSerializer.Deserialize<SomeObject>(someJsonString); 

// And somewhere else in the same codebase...
// This also uses my options
var soB = JsonSerializer.Deserialize<SomeOtherObject>(someOtherJsonString); 

希望不必JsonSerializerOptions为我们最常见的情况传递一个实例,并为异常而不是规则覆盖。

如本问答所述,这是 Json.Net 的一个有用功能。我查看了.NET Core的文档以及这个 GitHub 存储库。这个System.Text.Json

在 .NET Core 3 中似乎没有用于管理 JSON 序列化默认值的类比。还是我忽略了它?


4

6 回答 6

19

您可以创建扩展方法。这是一个例子

我使用单独的方法而不是必须构建特殊设置,以便所有设置都在一个位置并且易于重复使用。

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>();
于 2019-10-10T22:29:07.670 回答
14

不,JsonSerializerOptions不公开默认选项。如果您使用的是特定的 Web 框架,则可能有一种方法可以通过它指定(反)序列化设置。否则,我建议创建自己的便捷方法。

另请参阅此未解决的问题

于 2019-10-10T21:52:00.120 回答
10

JsonSerializer.NET Core 3.1未公开默认选项。但是,截至 2019 年 12 月,这已添加到5.0的路线图中。

.NET 5.0预计于 2020 年 11 月发布。但不能保证这个特定问题会在任何特定时间得到解决。除了等待之外,这些答案还建议了解决方法:

此外,受@ps2goat 的回答启发,我打包了我的便利扩展方法,并将它们放在nuget.orggithub 上

于 2019-12-23T15:37:25.453 回答
8

在 StartUp.ConfigureServices 中,这似乎对我有用:

services.AddControllers().AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
        options.JsonSerializerOptions.PropertyNamingPolicy=JsonNamingPolicy.CamelCase;
    });
于 2021-02-25T13:17:57.880 回答
7

GitHub 用户andre-ss6提出了一种解决方法,如下所示:

((JsonSerializerOptions)typeof(JsonSerializerOptions)
    .GetField("s_defaultOptions", 
        System.Reflection.BindingFlags.Static |
        System.Reflection.BindingFlags.NonPublic).GetValue(null))
    .PropertyNameCaseInsensitive = true;
于 2019-11-20T16:33:37.660 回答
-2

(如果你曾经切换到使用 Json.NET)

我更喜欢并建议明确并将设置传递给所有调用,但您可以使用DefaultSettings设置默认值。

JsonConvert.DefaultSettings = () => MySuperJsonSerializerSettings;

接着

var json = JsonConvert.SerializeObject(o1);
var o2 = JsonConvert.DeserializeObject(x);
于 2019-10-10T22:30:21.737 回答