我正在转换使用NewtonSoft.JsonNet编写的代码。这实际上是一个自定义的Json Media Type Formatter。我必须改变它,因为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
并将其添加到Serializer.Converters
Json.Net.Serializer
集合来执行此操作。试图摆脱Json.Net,我使用ServiceStack.Text
,但我不知道如何控制使用它生成的类型。有人可以帮我这个吗?
P.S。我在StackOverflow上发现了这篇文章,其中回答了类似的问题。但是,我从第三方Web服务获取json,因此我不能在其中包含类型名称。另外,我无法使用JsConfig
的通用版本,因为MediaTypeFormatter
没有任何通用方法。
答案 0 :(得分:2)
我建议避免尝试将JSON Serializer强制转换为模型,只使用将1:1映射到有线格式的DTO,而不是使用普通C#将已键入的DTO映射到所需的域模型。
据说,根据JSON和DTO的外观,您可以使用以下方法之一:
JsConfig<CatalogueItem>.RawDeserializeFn
JsConfig<CatalogueItem>.DeSerializeFn
JsConfig<CatalogueItem>.OnDeserializedFn
否则,您可以使用JsonObject here's an example动态解析JSON。