ServiceStack.文本反序列化json到对象总是转换为字符串和行为奇怪的引号
本文关键字:字符串 转换 json 反序列化 文本 对象 ServiceStack | 更新日期: 2023-09-27 18:03:17
我想做的:
我有json对象,其值可以是字符串,整型,双精度,或其中任何一个列表。我试图将这些json字符串反序列化为c#对象,但因为它们可以有多种类型,所以我只能使用泛型对象,而不是强类型的替代方案。
我的问题:它似乎好像ServiceStack.Text.JsonSerializer.DeserializeFromString(jsonString)函数在T = object的情况下行为奇怪。它将始终将内容视为字符串,并且不使用引号。
下面是一个例子:
string json1 = "[1]";
string json2 = "[1,2]";
string json3 = "['hello']";
string json4 = "['hello','world']";
string json5 = "['"hello'"]";
string json6 = "['"hello'",'"world'"]";
object o1 = JsonSerializer.DeserializeFromString<object>(json1);
object o2 = JsonSerializer.DeserializeFromString<object>(json2);
object o3 = JsonSerializer.DeserializeFromString<object>(json3);
object o4 = JsonSerializer.DeserializeFromString<object>(json4);
object o5 = JsonSerializer.DeserializeFromString<object>(json5);
object o6 = JsonSerializer.DeserializeFromString<object>(json6);
期望底层对象:
object type value
o1 List [1]
o2 List [1,2]
o3 List ['hello']
o4 List ['hello','world']
o5 List ["hello"]
o6 List ["hello","world"]
实际基础对象:
object type value
o1 String "[1]"
o2 String "[1,2]"
o3 String "['hello']"
o4 String "['hello','world']"
o5 String "["
o6 String "["
供参考,相应的代码块使用Newtonsoft。Json将底层对象解释为Netwonsoft.Json.Link.JArray.
按照目前的情况,我必须确保在json中使用单引号,然后对递归提取的任何字符串进行反序列化,直到所有内容都被正确提取。
我能做些什么来让这个行为的方式,我想使用ServiceStack.Text?
ServiceStack的文本序列化器通过将JSON转换为指定的模式来工作,当你使用对象时,不可能提前推断类型,所以为了在运行时做到这一点,ServiceStack的JSON序列化器需要发出一个专有的__type元数据属性,该属性告诉反序列化器要将其反序列化成什么。这只会在JSON对象字面量而不是数组时发出,这就是为什么它在这里不起作用。
下面是一些反序列化数组的方法:
string json6 = "['"hello'",'"world'"]";
var list = json6.FromJson<List<string>>();
list.PrintDump();
var array = json6.FromJson<string[]>();
array.PrintDump();
var arrayObj = json6.FromJson<object[]>();
arrayObj.PrintDump();