2015-09-09 73 views
2

我在解析Swift中的JSON時遇到了問題。我使用SwiftyJSON框架。SwiftyJSON字符串值爲空

我的數據來自網絡:

let dataString : NSString = NSString(data: data, encoding: NSUTF8StringEncoding)!; 

印刷本:

println("Received data: \(dataString)") 

給我的JSON:

Received data: {"result":"success"} 

但是,當我嘗試讀取結果值:

let json = JSON(dataString); 
println(json["result"].stringValue); //<-- empty string 

然後輸出爲空。我嘗試了不同的方法,如:

println(json[1]["result"].stringValue); //<-- empty string 
println(json["result"]); //<-- prints "null" 

但沒有到目前爲止的工作。我究竟做錯了什麼?

編輯: 這是服務器端(JAVA):

String response = client.isAuthenticated() ? "success" : "fail"; 
    client.send(new JSONObject().put("result", response).toString()); 

讀取數據我用CocoaAsyncSocket:

func socket(sock: GCDAsyncSocket!, didReadData data: NSData!, withTag tag: Int) 

我得到的錯誤是:

詞典[「結果」]失敗,它不是一本詞典

EDIT2: 我發現的問題是在數據:

let dataFromString = dataString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)? 

具有22個字節的長度。如果我設置

dataString : NSString = "{\"result\":\"success\"}" 

,並再次做同樣的,它的長度爲20個字節。我的數據有兩個字節0x0014在開頭:

<7b227265 73756c74 223a2273 75636365 7373227d> //<-- correct 
<00147b22 72657375 6c74223a 22737563 63657373 227d> // <-- mine 

如果我刪除這兩個輪空與

dataFromString!.subdataWithRange(NSMakeRange(2, 20)) 

的JSON能正確解析。

EDIT3(我的解決方案):

的問題是我在Java的服務使用的是DataOutputStream。它向我的JSON添加了兩個字節。我用BufferedOutputStream替換它,現在它按預期工作。

+0

的https: //github.com/SwiftyJSON/SwiftyJSON#initialization:JSON()需要一個JSON對象,而不是一個字符串。使用JSON(數據:) – Stefan

回答

0

你應該得到的字符串中的NSData,並用它初始化的JSON對象,這裏有一個例子:

let dataString : NSString = "{\"result\":\"success\"}" 

if let dataFromString = dataString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) { 
    let json = JSON(data: dataFromString) 
    print(json["result"]) 
} 

閱讀更多:SwiftyJSON - initialization

+0

好吧,我發現問題出在數據中。你的dataString包含20個字節(如預期),而我的包含22個字節。我不知道這些額外的2字節來自哪裏.. –

+0

我不知道這一點,但我想2個字節不會有這種影響,該服務可能已經返回多餘的空間或東西,無論如何你有沒有測試過我的數據爲例子? –

+0

是的,你的例子有效。我試圖從我的數據中刪除前兩個字節,然後我的代碼也起作用。字節是0x0014。我會編輯我的問題來解決這個問題。 –

1

您應該構造JSONinit(data:)構造函數與NSData

嘗試:

let json = JSON(data: data) 
+0

這不起作用 –