2017-02-12 47 views
1

比方說,有一個JSON字符串,我從服務器得到:「\」 3 \「」(帶引號,即長度== 3這裏)轉換普通字符串JSON和回斯威夫特

在Android中-world,我可以這樣做:

gson.fromJson(json, new TypeToken<String>() {}.getType()); - 它返回「3」(即長度== 1)

在C#-world,可以使用NewtonSoft.Json:

JsonConvert.DeserializeObject<string>(json, settings) - 它返回「3」(即長度== 1)

和其他方式,我確實有字符串我想序列化爲JSON。 在Android中我會做gson.toJson("\"3\"")和C# - JsonConvert.SerializeObject("\"3\"")

與JSONSerialization的問題是,它不把普通字符串作爲一個有效的JSON:JSONSerialization.isValidJSONObject("\"3\"") == *false*

什麼將是斯威夫特/ Obj-相當於C世界?

醜陋解決方法我發現(除了只是添加/刪除引號)迄今是包裝串入1項陣列,使JSONSerialization快樂,然後刪除「[」,「]」,從導致JSON字符串(以及其他方式 - 在反序列化之前添加「[」,「]」),但是對於這個問題真正的解決方案太令人厭惡了。

回答

2

當反序列不具有數組或 字典作爲頂級對象JSON可以通過 .allowFragments選項:

let jsonString = "\"3\"" 
let jsonData = jsonString.data(using: .utf8)! 

let json = try! JSONSerialization.jsonObject(with: jsonData, options: .allowFragments) 

if let str = json as? String { 
    print(str) // 3 
} 

然而,似乎沒有辦法連載一個純文本字符串JSON 與基礎庫中的JSONSerialization類。

請注意,根據JSON specification, JSON對象是一個名稱/值對(字典)或值的有序列表(數組)的集合。單個字符串不是有效的JSON對象 。