C# json.net使用CamelCasePropertyNamesContractResolver间接转换TimeZoneInfo
当我尝试使用CamelCasePropertyNamesContractResolver将TimeZoneInfo对象转换为JToken时,单元测试失败。所有属性名称都不是小写的。奇怪的是,这只影响TimeZoneInfo,而不影响其他类,如KeyValuePair(我测试过的类)。我不确定我是做错了,还是json.net的错误。我在C#4.0中使用了旧版本和最新版本6.0.3,两个版本都表现出相同的行为C# json.net使用CamelCasePropertyNamesContractResolver间接转换TimeZoneInfo,c#,json,json.net,C#,Json,Json.net,当我尝试使用CamelCasePropertyNamesContractResolver将TimeZoneInfo对象转换为JToken时,单元测试失败。所有属性名称都不是小写的。奇怪的是,这只影响TimeZoneInfo,而不影响其他类,如KeyValuePair(我测试过的类)。我不确定我是做错了,还是json.net的错误。我在C#4.0中使用了旧版本和最新版本6.0.3,两个版本都表现出相同的行为 [TestMethod] public void TimeZoneInfoConv
[TestMethod]
public void TimeZoneInfoConvertedCorrectly()
{
JToken actual2 = JToken.FromObject(new KeyValuePair<string, string>("test", "test2"), JsonSerializer.Create(
new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }));
// these don't fail
Assert.AreEqual(new JValue("test"), actual2["key"]);
Assert.AreEqual(new JValue("test2"), actual2["value"]);
JToken actual = JToken.FromObject(TimeZoneInfo.Utc, JsonSerializer.Create(
new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }));
// should fail but doesn't, right?
Assert.IsNull(actual["BaseUtcOffset"], "All the properties should be camel cased");
}
[TestMethod]
public void timezoneInfo转换正确()
{
JToken actual2=JToken.FromObject(新的KeyValuePair(“test”、“test2”),JsonSerializer.Create(
新的JsonSerializerSettings{ContractResolver=new CamelCasePropertyNamesContractResolver()});
//这些都不会失败
AreEqual(新JValue(“test”)、actual2[“key”]);
AreEqual(新的JValue(“test2”),实际值2[“value”);
JToken实际值=JToken.FromObject(TimeZoneInfo.Utc,JsonSerializer.Create(
新的JsonSerializerSettings{ContractResolver=new CamelCasePropertyNamesContractResolver()});
//应该失败,但不会,对吗?
IsNull(实际值[“BaseUtcOffset”],“所有属性都应采用驼峰大小写”);
}
TimeZoneInfo
未使用Json.NET的对象转换器进行序列化。而是使用ISerializable
接口的GetObjectData
方法的实现。反序列化时,使用私有构造函数。NET框架显然不关心您为Json.NET设置的选项
当序列化任何类型的对象实现iseerializable
、具有手动读取/写入属性的自定义JSON转换器等时,您的设置将被忽略
如果要自定义此类类型的序列化,需要编写自定义转换器。要禁用此行为,需要将IgnoreSerializableInterface标志添加到contractResolver。@user1991909我不建议这样做。如果您这样做,我不能保证普通字段/属性序列化将正常工作。字段有“m_3;”前缀,属性不包含某些数据(特别是调整规则)。如果一个类型实现了ISerializable,很可能是有原因的。