我正在转换使用NewtonSoft.JsonNet编写的代码。这实际上是一个自定义的Json媒体类型格式化程序。我不得不更改它,因为Json.Net已经证明它在负载下的性能非常差。互联网上的许多比较也证明了这一点。
总之,我有一个基本类型,叫做CatalogueItem
。从这种类型派生出三种类型,分别称为ContainerItem
、SectionItem
和RefresherItem
。基于Json对象中名为itemType
的属性,我们决定必须实例化哪个子类。
var type = (string)jsonObject.Property("itemType");
switch (type)
{
case "Container":
return new ContainerItem();
case "Section":
return new SectionItem();
case "Refresher":
return new RefresherItem();
}
我们过去常常创建一个自定义的CustomCreationConverter
,并将其添加到Json.Net.Serializer
的Serializer.Converters
集合中。为了摆脱Json.Net,我正在使用ServiceStack.Text
,但我不知道如何控制使用它生成的类型。有人能帮我吗?
附言:我在StackOverflow上发现了这篇帖子,其中也回答了类似的问题。但是,我从第三方web服务获得json,所以我不能在其中包含类型名称。此外,我不能使用JsConfig
的通用版本,因为MediaTypeFormatter
没有任何通用方法。
我建议避免试图将JSON序列化程序强制到您的模型,只使用1:1映射到有线格式的DTO,而不是使用普通C#将类型化的DTO映射到您想要的域模型。
话虽如此,根据JSON和DTO的外观,您可能可以使用以下其中一种:
JsConfig<CatalogueItem>.RawDeserializeFn
JsConfig<CatalogueItem>.DeSerializeFn
JsConfig<CatalogueItem>.OnDeserializedFn
否则,您可以使用JsonObject动态解析JSON,这里有一个示例。