我正在尝试做什么:
我有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的方式相同?
答案 0 :(得分:3)
ServiceStack的文本序列化程序通过将JSON转换为指定的模式来工作,当您使用对象时,它无法提前推断出类型,因此为了在运行时执行此操作,ServiceStack的JSON Serializer需要发出专有的 __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();