使用 json.net 这个测试默认失败:
JsonConvert.DeserializeObject(
JsonConvert.SerializeObject(new object()), typeof(object)
).ShouldBeOfType<object>(); // actual type is JObject
有没有办法改变这种行为,让它反序列化为实际请求的类型?
你有一个退化的测试用例。如果您指示 Json.Net 反序列化为 type object
,则是在告诉它 JSON 可以表示任何可能的对象。所以JObject
在这种情况下它会选择使用 a ,因为你不是特定的并且 aJObject
可以处理任何 JSON 对象。不期望您想要反序列化为一个字面上的空object
实例,因为这不是一件非常有用的事情。如果 JSON 包含任何数据,反序列化后您将无法访问该数据:object
没有属性!
您可以通过创建一个空类Foo
并使用它代替来修复您的测试object
:
JsonConvert.DeserializeObject(
JsonConvert.SerializeObject(new Foo()), typeof(Foo)
).ShouldBeOfType<Foo>();
如果您确实需要强制 Json.Netobject
在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>();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句