2013-03-11 72 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

相關問題