如何将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;
}
似乎这不是一个非常好的选择。每次获得新的具体类型时,都必须添加另一个案例选项。 – ant 2012-11-01 20:21:05
@ant但是这就是工厂/映射器的情况 - 你有什么其他的机会?链接必须知道*某处*,并且每当您引入一个新类型时,您都必须在某处调整* ...如果您为此注册表:某些注册表调用...如果您创建数组与键=类型和值=工厂方法:某处是'push'调用...在我的情况下主要问题是:我正在处理'enums' - 如果我有类/复杂类型我可以介绍一些'抽象'/'虚拟'属性来实现这个工厂......但我正在处理价值......悲伤但真实...... – 2012-11-02 06:50:34
10年后 - 总结 - 你应该使用策略模式方法...... – 2016-05-18 15:56:02