C# Text将json反序列化为对象始终转换为字符串,并使用引号进行奇怪的行为
我想做的是: 我有json对象,它们的值可以是string、ints、Double或其中任何一个的列表。我试图将这些json字符串反序列化为C#对象,但由于它们可能有多种类型,因此我只能使用泛型对象,而不是强类型的替代对象 我的问题:在T=object的情况下,ServiceStack.Text.JsonSerializer.DeserializeFromString(jsonString)函数的行为似乎异常。它将始终将事物视为字符串,不使用引号 下面是一个例子:C# Text将json反序列化为对象始终转换为字符串,并使用引号进行奇怪的行为,c#,json,servicestack,C#,Json,servicestack,我想做的是: 我有json对象,它们的值可以是string、ints、Double或其中任何一个的列表。我试图将这些json字符串反序列化为C#对象,但由于它们可能有多种类型,因此我只能使用泛型对象,而不是强类型的替代对象 我的问题:在T=object的情况下,ServiceStack.Text.JsonSerializer.DeserializeFromString(jsonString)函数的行为似乎异常。它将始终将事物视为字符串,不使用引号 下面是一个例子: string json1 =
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的相应代码块将底层对象解释为nethonsoft.Json.Link.JArray
目前,我必须确保json中使用单引号,然后对递归提取的任何字符串进行反序列化,直到所有内容都被正确提取
我可以做些什么来让它以我喜欢的方式使用ServiceStack.Text吗?ServiceStack的文本序列化程序通过将JSON转换为指定的模式来工作,当您使用object时,无法提前推断类型,因此,为了在运行时做到这一点,ServiceStack的JSON序列化程序需要发出一个专有的\uuuu 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();
string json6=“[\'hello\',\'world\'”;
var list=json6.FromJson();
PrintDump();
var array=json6.FromJson();
PrintDump();
var arrayObj=json6.FromJson();
arrayObj.PrintDump();
感谢您的回复——这很有道理。虽然看起来不那么优雅,但看起来好像我可以简单地将所有内容都视为一个对象数组,单个字符串或值被适当地反序列化为一个长度为1的数组,并具有适当的对象文字。我的友好建议是在“[/*…*/]”上添加隐式处理以充当数组,但这只是我的2美分:)你知道为什么双引号会破坏字符串大小写吗?一定要添加失败的测试,这样每个人都可以跟踪它。我知道这是一个古老的答案,但是我想知道我们是否仍然不能选择为已知风险的数组发出_类型属性?或者我可以编写在数组的序列化和反序列化期间调用的扩展方法吗?