Json反序列化并控制实例化

时间:2014-01-31 08:32:53

标签: c# json servicestack json.net

我正在转换使用NewtonSoft.JsonNet编写的代码。这实际上是一个自定义的Json Media Type Formatter。我必须改变它,因为Json.Net已证明其在负载下的性能非常差。互联网上的许多比较也证明了这一点。

无论如何,我有一个名为CatalogueItem的基本类型。这种类型派生出三种类型,称为ContainerItemSectionItemRefresherItem。基于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没有任何通用方法。

1 个答案:

答案 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。