ServiceStack ORMLite JSON 多级反序列化

ServiceStack ORMLite JSON Deserialization multiple levels

我有一个 class 包含这样的字典:

Dictionary<string,object> Data

我把多层次的数据放到这里,比如:

Data.Add("simple",4);
Data.Add("object",new Dictionary<string,object>{{"key",4}});
Data.Add("array",new List<string>{"a","b","c"});

然后我用 OrmLite .Save() 它,它被设置为使用 JSON 而不是 JSV:

SqliteDialect.Provider.StringSerializer = new JsonStringSerializer();

查看存储的数据,使用 SQL,看起来完全有效 JSON。

{
    "simple": 4,
    "object": {
        "key": 4
    },
    "array": [
        "a","b","c"
    ]
}

但是,当我 Load() 返回数据时,它不会反序列化回原始数据。

这里是 link 到 Gist Cafe,显示了问题: https://gist.cafe/9ed2bbb3a6a0348f129c493887ae8170

默认情况下 JsonStringSerializer 使用 ServiceStack.Text Typed JSON Serializer 无法将 object 反序列化回其原始类型由于该类型信息丢失,它所看到的只是运行时 object 它作为字符串保留的类型,因为它不知道应该反序列化到哪个其他对象。

这就是为什么建议您序列化类型化 DTO 以保留类型信息的原因,例如:

class CustomData
{
    public int Simple { get; set; }
    public Dictionary<string,int> Object { get; set; }
}

如果您想将匿名 object 数据结构反序列化为非类型化集合,您可以配置 ServiceStack.Text 以使用 JS Utils 来处理将任意 JSON 反序列化为非类型化数据结构注册它:

ServiceStack.JS.Configure();

我在这个修改后的要点中所做的:

https://gist.cafe/953f2da51a5077ecf7b5109c14ec2c32

输出预期结果:

{
    Id: 1,
    Data: 
    {
        simple: 4,
        object: 
        {
            key: 4
        },
        array: 
        [
            a,
            b,
            c
        ]
    }
}

虽然它在这个实例中有效,因为你只使用序列化 JSON 数据类型,但如果你的对象字典包含复杂类型,它就不会工作,因为所有 JS Utils 可以看到的都是原始 JSON没有任何类型信息的字符串,因此它只能反序列化为与 JSON 对象匹配的非类型化集合 - 这就是为什么建议序列化类型化 DTO 以保留类型的原因。