当我尝试将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");
}
TimeZoneInfo
不是使用Json序列化的。. NET的对象转换器。采用ISerializable
接口的GetObjectData
方法实现。当反序列化时,使用私有构造函数。net框架,显然,不关心你为Json.NET设置的选项。
当序列化实现ISerializable
的任何类型的对象时,您的设置将被忽略,具有手动读取/写入属性的自定义JSON转换器等。
如果您想自定义此类类型的序列化,则需要编写自定义转换器。