繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM