C# json.net使用CamelCasePropertyNamesContractResolver间接转换TimeZoneInfo

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

当我尝试使用CamelCasePropertyNamesContractResolver将TimeZoneInfo对象转换为JToken时,单元测试失败。所有属性名称都不是小写的。奇怪的是,这只影响TimeZoneInfo,而不影响其他类,如KeyValuePair(我测试过的类)。我不确定我是做错了,还是json.net的错误。我在C#4.0中使用了旧版本和最新版本6.0.3,两个版本都表现出相同的行为

  [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,很可能是有原因的。