如何将JsonObject实例转换/反序列化为具体类?

问题描述:

我有以下DTO如何将JsonObject实例转换/反序列化为具体类?

public class Foo 
{ 
    public ServiceStack.Text.JsonObject Bar { get; set; } 
} 

Foo.Bar可以是一出其他3个DTO的

某处在我的代码,我想映射/转换/反序列化Foo.Bar到具体的DTO(我知道ServiceStack.Text.JsonObject工具System.Collection.Generic.Dictionary<string, string> - 有趣的是,作为非字符串传输的值,以字符串形式进入我的ServiceStack.Text.JsonObject-实例)。

所以我试图

ServiceStack.Text.JsonExtensions.JsonTo<ConcreteDTO>(foo.Bar, ???) 

,但它需要一个键选择作为第二个参数 - 但我不希望将单个值,而我会去为整个实例。

我也知道有ServiceStack.Text.JsonExtensions.ConvertTo<T>(JsonObject jsonObject, Func<JsonObject, T> convertFn),但我不想转换手动编码的jsonObject。

那么,我该如何解决这个问题呢?

编辑:
只是要清楚 - 我不想去的弯路和序列化JsonObject -instance为JSON字符串只是为了反序列化...有来自JsonObject任何直接的反序列化选项?

那么...我结束了:

DTO concreteDTO; 
var jsonString = JsonSerializer.SerializeToString(foo.Bar); 
switch (foo.ConcreteObjectType) 
{ 
    case ObjectType.Foo1: 
     concreteDTO = jsonString.FromJson<DTO1>(); 
     break; 
    case ObjectType.Foo2: 
     concreteDTO = jsonString.FromJson<DTO2>(); 
     break; 
    case ObjectType.Foo3: 
     concreteDTO = jsonString.FromJson<DTO3>(); 
     break; 
} 
+0

似乎这不是一个非常好的选择。每次获得新的具体类型时,都必须添加另一个案例选项。 – ant 2012-11-01 20:21:05

+0

@ant但是这就是工厂/映射器的情况 - 你有什么其他的机会?链接必须知道*某处*,并且每当您引入一个新类型时,您都必须在某处调整* ...如果您为此注册表:某些注册表调用...如果您创建数组与键=类型和值=工厂方法:某处是'push'调用...在我的情况下主要问题是:我正在处理'enums' - 如果我有类/复杂类型我可以介绍一些'抽象'/'虚拟'属性来实现这个工厂......但我正在处理价值......悲伤但真实...... – 2012-11-02 06:50:34

+0

10年后 - 总结 - 你应该使用策略模式方法...... – 2016-05-18 15:56:02