使用json.net,此测试默认失败:
JsonConvert.DeserializeObject(
JsonConvert.SerializeObject(new object()),
typeof(object)
).ShouldBeOfType<object>(); // actual type is JObject
有没有办法改变这种行为,使其反序列化为实际请求的类型?
您有一个退化的测试用例。如果您指示Json.Net反序列化为类型object
,那么您就是在告诉它Json可以表示任何可能的对象。因此,在这种情况下,它将选择使用JObject
,因为您不是特定的,JObject
可以处理任何JSON对象。不要期望你想反序列化为一个字面上空的object
实例,因为这不是一件很有用的事情。如果JSON包含任何数据,那么在反序列化后你将无法访问该数据:object
没有属性!
您可以通过创建一个空类Foo
并使用它来代替object
:来修复测试
JsonConvert.DeserializeObject(
JsonConvert.SerializeObject(new Foo()), typeof(Foo)
).ShouldBeOfType<Foo>();
如果您确实需要在object
被指定为类型时强制Json.Net反序列化为空的object
实例,那么您可以使用自定义JsonConverter
来完成,如下所示:
public class EmptyObjectConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(object);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader); // consume the JSON object from the reader
return token.Type == JTokenType.Null ? null : new object();
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后将转换器的实例传递给JsonConvert.DeserializeObject()
:
JsonConvert.DeserializeObject(
JsonConvert.SerializeObject(new object()),
typeof(object),
new EmptyObjectConverter()
).ShouldBeOfType<object>();
Fiddle:https://dotnetfiddle.net/7xZ7tm