2

我有以下 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>- 有趣的是,作为非字符串传输的值,作为字符串进入我的ServiceStack.Text.JsonObject-instance)。

所以我试过了

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

但它需要一个键选择器作为第二个参数 - 但我不想转换单个值,而是我会选择整个实例。

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

那么,我该如何解决呢?

编辑:
为了清楚起见 - 我不想绕道而行并将JsonObject-instance 序列化为 json-string 只是为了反序列化它......是否有任何直接反序列化选项JsonObject

4

1 回答 1

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;
}
于 2012-08-20T06:45:00.213 回答