Tre*_*eid 37 c# serialization json .net-core system.text.json
取而代之的是:
JsonSerializerOptions options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
// etc.
};
var so = JsonSerializer.Deserialize<SomeObject>(someJsonString, options);
Run Code Online (Sandbox Code Playgroud)
我想做这样的事情:
// 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);
Run Code Online (Sandbox Code Playgroud)
希望不必JsonSerializerOptions为我们最常见的情况传递一个实例,并覆盖异常而不是规则。
如本问答中所示,这是 Json.Net 的一个有用功能。我看着在文档的System.Text.Json以及这个GitHub库为.NET的核心。还有这个。
.NET Core 3 中似乎没有用于管理 JSON 序列化默认值的模拟。还是我忽略了它?
更新 [2019-10-10]: 如果有兴趣看到此行为的实施,请System.Text.Json.JsonSerializer转到Chris Yungmann指出的开放 GitHub 问题并权衡。
ps2*_*oat 15
您可以创建扩展方法。这是一个例子
我使用单独的方法而不是必须构建特殊设置,以便所有设置都在一个地方并且可以轻松重复使用。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后将其作为字符串的方法调用,无论是文字还是变量。
Car result = @"{""Wheels"": 4, ""Doors"": 2}".DeserializeFeatureX<Car>();
Run Code Online (Sandbox Code Playgroud)
GitHub 用户andre-ss6提出了一种解决方法,如下所示:
((JsonSerializerOptions)typeof(JsonSerializerOptions)
.GetField("s_defaultOptions",
System.Reflection.BindingFlags.Static |
System.Reflection.BindingFlags.NonPublic).GetValue(null))
.PropertyNameCaseInsensitive = true;
Run Code Online (Sandbox Code Playgroud)
小智 6
这似乎对我有用,在 StartUp.ConfigureServices 中:
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
options.JsonSerializerOptions.PropertyNamingPolicy=JsonNamingPolicy.CamelCase;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16341 次 |
| 最近记录: |