C# 如何使用json.net(而不是JObject)反序列化到对象
使用json.net,默认情况下,此测试失败:C# 如何使用json.net(而不是JObject)反序列化到对象,c#,json.net,C#,Json.net,使用json.net,默认情况下,此测试失败: JsonConvert.DeserializeObject( JsonConvert.SerializeObject(new object()), typeof(object) ).ShouldBeOfType<object>(); // actual type is JObject JsonConvert.DeserializeObject( JsonConvert.SerializeObject(新对象()),typeof
JsonConvert.DeserializeObject(
JsonConvert.SerializeObject(new object()), typeof(object)
).ShouldBeOfType<object>(); // actual type is JObject
JsonConvert.DeserializeObject(
JsonConvert.SerializeObject(新对象()),typeof(对象)
).ShouldBeOfType();//实际类型是JObject
是否有办法更改此行为,使其反序列化为实际请求的类型?您有一个退化的测试用例。如果您指示Json.Net将类型反序列化为
对象
,您就是在告诉它Json可以表示任何可能的对象。因此,在这种情况下,它将选择使用JObject
,因为您不是特定的,JObject
可以处理任何JSON对象。您不希望反序列化为一个文本空的对象
实例,因为这不是一件非常有用的事情。如果JSON包含任何数据,那么在反序列化之后您将无法访问该数据:对象
没有属性
您可以通过创建一个空类Foo
并用它代替对象来修复测试:
JsonConvert.DeserializeObject(
JsonConvert.SerializeObject(new Foo()), typeof(Foo)
).ShouldBeOfType<Foo>();
JsonConvert.DeserializeObject(
JsonConvert.SerializeObject(new object()),
typeof(object),
new EmptyObjectConverter()
).ShouldBeOfType<object>();
然后将转换器的实例传递给JsonConvert.DeserializeObject()
:
JsonConvert.DeserializeObject(
JsonConvert.SerializeObject(新对象()),
类型(对象),
新的EmptyObjectConverter()
).ShouldBeOfType();
Fiddle:谢谢您的回答,但正如测试用例所反映的,反序列化到空对象实际上是我想要做的。我可以理解为什么这通常不有用,我理解所选择的行为,但我希望能够改变它。我需要在两侧都有一个相同类型的实例,该类型有时可以是object。当然,我可以包装它,检查给定的类型,并在需要时自己创建对象,但我只是想知道,是否有一种“内置”方式。我不能用定制的契约解析器来完成,但我可能忽略了一些东西。你可以用定制的JsonConverter做你想做的事情。我已经更新了答案。您可能需要检查reader.TokenType==JsonToken.Null
。当前JObject.Parse(“null”)代码>抛出异常而不是返回null。啊,是的,为什么我没有想到,就是这样。谢谢!:)
JsonConvert.DeserializeObject(
JsonConvert.SerializeObject(new object()),
typeof(object),
new EmptyObjectConverter()
).ShouldBeOfType<object>();