使用JSON.net,我想反序列化从抽象类继承的类型列表。我使用KnownTypesBinder
(source)喜欢
var jsonSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
jsonSettings.TypeNameHandling = TypeNameHandling.Auto;
jsonSettings.Binder = new KnownTypesBinder { KnownTypes = new List<Type> { ... } };
现在,这在WEB API模型绑定器中运行得非常好; KnownTypesBinder.BindToType
被称为可以反序列化的对象。在Web应用程序的不同部分,我必须反序列化JSON字符串,所以我想重用相同的JsonFormatter。根据文档,以下内容应该有效;
JsonConvert.DeserializeObject<T>(String, JsonSerializerSettings);
然而,当我这样做时:
JsonConvert.DeserializeObject<A>(jsonString, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings);
抛出以下错误:
JsonSerializationException。无法创建类型为C的实例.Type是接口或抽象类,无法实例化。
我的类型看起来像这样;
class A {
public B B { get; set; }
}
class B {
public List<C> C { get; set; }
}
abstract class C { }
class C1: C { }
class C2: C { }
同时创建新的JsonSerializerSettings并设置Binder
和TypeNameHandling
没有任何区别。我发现KnownTypesBinder.BindToType
根本没有被调用。 JSON.net中有什么东西我不见了吗?
答案 0 :(得分:0)
这里感觉很蠢。 JSON.net使用的鉴别器称为"$type"
。当我使用curl
发送POST有效负载时,bash尝试将$type
解析为环境变量。由于没有这样的变量,最终的JSON只是{"": "C"}
而不是{"$type": "C"}
。