如何使用json.net(而不是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>();

Fiddle:https://dotnetfiddle.net/7xZ7tm

最新更新