用CamelCasePropertyNamesContractResolver转换TimeZoneInfo错误

本文关键字:错误 TimeZoneInfo 转换 CamelCasePropertyNamesContractResolver | 更新日期: 2023-09-27 18:16:27

当我尝试将TimeZoneInfo对象转换为CamelCasePropertyNamesContractResolver的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");
  }

用CamelCasePropertyNamesContractResolver转换TimeZoneInfo错误

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

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

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