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 以保留类型的原因。
我有一个 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 以保留类型的原因。