我关注DTO
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>
- 有趣的是值,这些值是作为非传输的string,进入我的ServiceStack.Text.JsonObject
- 实例作为字符串)。
所以我试过了
ServiceStack.Text.JsonExtensions.JsonTo<ConcreteDTO>(foo.Bar, ???)
但它需要一个键选择器作为第二个参数 - 但我不想转换单个值,而是我会选择整个实例。
我也知道有ServiceStack.Text.JsonExtensions.ConvertTo<T>(JsonObject jsonObject, Func<JsonObject, T> convertFn)
,但我不想转换手工编码的jsonObject。
那么,我该如何解决这个问题?
编辑:
只是要清楚 - 我不想绕道而且将JsonObject
- 实例序列化为json-string只是为了反序列化它...来自JsonObject
是否有任何直接反序列化选项?
答案 0 :(得分:1)
所以...我最终得到了什么:
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;
}