C# 如何使用json.net(而不是JObject)反序列化到对象

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

使用json.net,默认情况下,此测试失败:

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>();