[英]How do I deserialize to object with json.net (instead of JObject)
使用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>();
小提琴: https : //dotnetfiddle.net/7xZ7tm
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.