2013-03-11 35 views
3
奇怪的行为

我想要做的事:ServiceStack.Text反序列化JSON总是对象转换为字符串,并用引号

我有一个有可能是字符串,整型值,双打,或列表的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?

回答

3

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(); 
+0

感谢您的答复 - 这是有道理的。虽然看起来稍显不够优雅,但看起来好像我可以简单地将所有对象视为对象数组,并将单个字符串或值适当反序列化为具有适当对象字面值的长度数组。我的友好建议是在“[/ * ... * /]”上添加隐式处理以充当数组,但这只是我的2美分:) 有任何了解双引号会打破字符串大小写的原因吗? – 2013-03-11 20:05:43

+0

当然,添加失败的测试[作为GitHub上的一个新问题](https://github.com/ServiceStack/ServiceStack.Text/issues),以便每个人都可以跟踪它。 – mythz 2013-03-11 21:07:43

+1

我知道这是一个旧的答案,但我想知道如果我们仍然不能选择发布阵列的__type属性知道风险?或者我可以编写在数组的序列化和反序列化过程中将被调用的扩展方法吗? – 2015-05-19 16:00:41

相关问题