为什么我的抽象JSON对象不被解析?

为什么我的抽象JSON对象不被解析?

问题描述:

我刚刚花了很长时间试图完成这项工作,所以我会在这里发帖,以防其他人与我犯相同的错误。为什么我的抽象JSON对象不被解析?

所以,复制的情况,我只是有几类基本继承:

public abstract class Foo 
{ 
    public string Name { get; set; } 
} 

public class Bar : Foo 
{ 
    public int SomethingSpecial { get; set; } 
} 

public class Baz : Foo 
{ 
    public string SomethingMundane { get; set; } 
} 

现在,我希望能够把一个JSON字符串,并解析回一个具体实施Foo,事先不知道json代表了哪种类型。 JSON.Net处理此,通过使用$类型变量来查找对象的类型:

{ 
    "$type": "MyNamespace.Bar", 
    "Name": "Resources", 
    "SomethingSpecial": 42 
} 

当反序列化对象,你可能想指定类型处理选项和定制绑定,在JsonSerializerSettings中,但这是可选的。

我遇到的问题是,当从web客户端发布json时,该对象没有被反序列化,而是引发异常,或者在ASP.Net中的POST参数的情况下,该值只是进来作为null

这里的问题是,Newtonsoft.Json(至少我使用的版本 - 9.0.1)预计$类型元素为对象的第一元素,将忽略它的时候它在任何其他位置。所以下面的JSON,虽然在技术上等同于问题的JSON,将无法正常工作:

{ 
    "Name": "Resources", 
    "$type": "MyNamespace.Bar", 
    "SomethingSpecial": 42 
} 

此设置,虽然它可能会影响性能:

new JsonSerializerSettings 
{ 
    // $type no longer needs to be first 
    MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead 
} 

值得注意的是,如果您使用的是JavaScript的JSON.stringify函数,属性通常会按照它们首次分配给该对象的顺序写出,因此您还可以确保第一件事是分配$类型