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