c# - Newtonsoft JsonConvert.DefaultSettings 奇怪的行为
问题描述
我在我的应用程序中遇到了奇怪的行为(至少对我来说),JsonConvert.DefaultSettings
我为整个应用程序定义了默认的 json 设置,但是如果我需要某个对象的独占序列化,我认为我可以JsonSerializerSettings
作为第二个参数传递给JsonConvert.SerializeObject
该设置将覆盖默认值。但这似乎是不正确的。
我发现作为第二个参数传递的设置被忽略了。所以,如果我需要独占序列化并且有定义的默认设置,我必须这样做:
var defs = JsonConvert.DefaultSettings;
JsonConvert.DefaultSettings = null;
var settings = new JsonSerializerSettings();
var jsonString = JsonConvert.SerializeObject(someObject, settings);
JsonConvert.DefaultSettings = defs;
问题:这是一个错误还是我只是不明白什么?如果它不是错误,有人可以向我解释这种行为吗?
由于https://dotnetfiddle.net上的 nuget 包损坏,我现在无法准备小提琴
但这里是这种情况的一个例子:
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
public class Program
{
public enum TestEnum {
Zero,
One,
Two
}
public class Something
{
public string Name {get; set;}
public TestEnum Num {get; set;}
}
public void Main()
{
var test = new Something {
Name = "foo",
Num = TestEnum.One
};
string json = JsonConvert.SerializeObject(test);
Console.WriteLine(json);
// {"Name":"foo","Num":1}
JsonConvert.DefaultSettings = (() =>
{
var JsonSetting = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
};
JsonSetting.Converters.Add(new StringEnumConverter()
{
CamelCaseText = true
});
return JsonSetting;
});
json = JsonConvert.SerializeObject(test);
Console.WriteLine(json);
//{"name":"foo","num":"one"}
var settings = new JsonSerializerSettings();
json = JsonConvert.SerializeObject(test, settings);
Console.WriteLine(json);
//this will result in: {"name":"foo","num":"one"}
//but i expect this: {"Name":"foo","Num":1}
}
}
解决方案
如果实例化一个新JsonSerializerSettings
实例,它的ContractResolver
属性是null
. 然后在 中JsonConvert.SerializeObject()
,JsonSerializer
实例化 a 并使用传递的设置进行配置。
相关代码:
if (settings.ContractResolver != null)
serializer.ContractResolver = settings.ContractResolver;
的JsonSerializer
构造函数将其初始化ContractResolver
为DefaultContractResolver.Instance
。因此,如果您未在传递的设置中指定合同解析器,它将解析为默认值。
推荐阅读
- regex - 如何获取捕获组的计数,然后用特定字符替换字符?
- reactjs - Azure 存储静态站点环境变量
- reactjs - 是否有可能在 chartjs 图表上获得 X 轴和 Y 轴的显示最小值和最大值?
- php - Yii2:如何更改系统消息翻译文件
- qt - Qt Quick - 在组件状态更改时动画图像转换的最佳方法是什么?
- python - 返回特定日期的工作日数(Python)
- android - RecyclerView.ViewHolder中的Android ScrollView:防止ItemTouchHelper获取触摸事件?
- amazon-web-services - 在 Amazon QuickSight 中使用来自不同数据源的数据绘制趋势图
- python - 即使我只想要最新版本,我的函数也会不断返回我的变量的旧版本
- sql-server - 如何按主键将元数据附加到分组选择