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转换为指定的模式来工作,当你使用对象时,不可能提前推断类型,所以为了在运行时做到这一点,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();