json.net使用CamelCasePropertyNamesContractResolver将TimeZoneInfo转换为incorectly

时间:2014-08-05 01:09:25

标签: c# json json.net

当我尝试使用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");
  }

1 个答案:

答案 0 :(得分:0)

TimeZoneInfo未使用Json.NET的对象转换器序列化。而是使用ISerializable接口的GetObjectData方法的实现。反序列化时,使用私有构造函数。显然,.NET框架并不关心您为Json.NET设置的选项。

在序列化实现ISerializable的任何类型的对象时,将忽略您的设置,具有手动读/写属性的自定义JSON转换器等。

如果要自定义此类型的序列化,则需要编写自定义转换器。