Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Text将json反序列化为对象始终转换为字符串,并使用引号进行奇怪的行为_C#_Json_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,Json,servicestack" /> servicestack,C#,Json,servicestack" />

C# Text将json反序列化为对象始终转换为字符串,并使用引号进行奇怪的行为

C# Text将json反序列化为对象始终转换为字符串,并使用引号进行奇怪的行为,c#,json,servicestack,C#,Json,servicestack,我想做的是: 我有json对象,它们的值可以是string、ints、Double或其中任何一个的列表。我试图将这些json字符串反序列化为C#对象,但由于它们可能有多种类型,因此我只能使用泛型对象,而不是强类型的替代对象 我的问题:在T=object的情况下,ServiceStack.Text.JsonSerializer.DeserializeFromString(jsonString)函数的行为似乎异常。它将始终将事物视为字符串,不使用引号 下面是一个例子: string json1 =

我想做的是:

我有json对象,它们的值可以是string、ints、Double或其中任何一个的列表。我试图将这些json字符串反序列化为C#对象,但由于它们可能有多种类型,因此我只能使用泛型对象,而不是强类型的替代对象

我的问题:在T=object的情况下,ServiceStack.Text.JsonSerializer.DeserializeFromString(jsonString)函数的行为似乎异常。它将始终将事物视为字符串,不使用引号

下面是一个例子:

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美分:)你知道为什么双引号会破坏字符串大小写吗?一定要添加失败的测试,这样每个人都可以跟踪它。我知道这是一个古老的答案,但是我想知道我们是否仍然不能选择为已知风险的数组发出_类型属性?或者我可以编写在数组的序列化和反序列化期间调用的扩展方法吗?