Serialization 接口类型的JSON反序列化,不带$type;伪属性;?

Serialization 接口类型的JSON反序列化,不带$type;伪属性;?,serialization,interface,polymorphism,json.net,Serialization,Interface,Polymorphism,Json.net,使用声明为接口类型的成员序列化对象很容易-我们只需设置以下配置: JsonSerializerSettings settings = new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Objects, TypeNameAssemblyFormat = System.Runtime.Seri

使用声明为接口类型的成员序列化对象很容易-我们只需设置以下配置:

JsonSerializerSettings settings = new JsonSerializerSettings()
            {                   
                TypeNameHandling = TypeNameHandling.Objects,
                TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
            };
这将为每个对象创建一个“假属性”$类型,对于接口类型的数据,它将是序列化之前的确切类型。这是有意义的,因为反序列化程序需要知道如何重建它,并且没有其他可靠的方法来重建它,特别是如果您有具有完全相同属性但不同函数实现的接口

下面通过检查自定义转换器中的属性值(确定它是子属性还是子属性)来解决这个问题,但我们不能总是这样做。因此,我们不得不使用$type的Newtonsoft解决方案

还有一种方法可以删除$type值的名称空间,这有助于(通过缩短),但我仍然不想让前端必须在将$type“属性”传递给API调用之前编写它


本质上,我希望前端不关心$type,但在后端(甚至在API函数中),我希望使用完整对象,就像它从未被序列化(然后反序列化)一样。我应该如何设计我的接口和对象?我还需要做哪些Newtonsoft设置?

为了在反序列化过程中支持多态类,Json.Net需要在Json中使用某种指示符来指示要实例化的具体类型。您可以使用内置的
$type
机制(
typenameholding=typenameholding.Objects
),也可以使用自定义的
JsonConverter
来处理实例化。这是两种选择,除非您想求助于弱类型对象(例如
JObject
dynamic
)。当你说你“不能总是使用转换器”的时候,是什么阻碍了你?当我说“自定义转换器,但我们不能总是这样做”的时候,我的意思是我们不能总是检查要转换为具体类型的对象是否具有特定的属性。看起来我将采用JsonConverter方法,我最近发现您可以拦截序列化过程并添加一个属性用于“具体类型记账目的”,该属性不是默认的$type。实际上,反序列化时读取类型指示符属性的转换器(有时称为“鉴别器”)可以在序列化时向JSON添加这样的属性。