2013-06-13 51 views
0

我試圖做一個HTTP PUT請求到CouchDB服務器。我將一個NSString實例轉換爲NSData。然後,我將這個NSData實例轉換爲一個NSArray,並嘗試將其放到CouchDB中。因此,像這樣:序列化JSON沒有包裝在[]

//convert string to NSData 
    NSData *docData = [@"{\"name\":\"nick\"}" dataUsingEncoding:NSUTF8StringEncoding]; 
//NSData to NSArray 
    NSArray *arrayJson = [NSArray arrayWithObjects:[NSJSONSerialization JSONObjectWithData:docData options:kNilOptions error:nil],nil]; 

我然後創建一個使用AFNetworking HTTP PUT請求(這是RAD BTW;))

的問題是,這將創建一個JSON字符串,它看起來像:

[{"name":"nick"}] 

這是有效的JSON,但沙發抱怨400壞JSON。刪除[]可以解決問題。我確定這些括號是將NSData轉換爲NSArray的結果,但我不知道如何使用NSJSONSerialization來完成此操作。誰能幫忙?

謝謝!

編輯

爲了清楚起見,讓我解釋一下,我還具有的問題。我正在使用CUTDB HTTP API使用PUT HTTP請求創建文檔。該文件可以是手工編碼的JSON,這就是爲什麼我有這個解析挑戰。沙發希望創建一個文檔。因此它期望一個單一的JSON對象。不是它們的數組。這似乎是[{「key」:「value」}]從Couch返回400 HTTP響應的原因。即使數組包含單個對象。看起來有點挑剔,API不會根據數組長度正確推斷..但我想你可以爭論任何一種方式。請參閱下面的選定答案。這是我正在尋找的。感謝所有那些迴應!

+0

你在哪裏創建你發送的實際數據?爲什麼你需要使用NSArray? – borrrden

+0

我寧可不使用NSArray。我希望HTTP正文包含這樣的JSON:{「name」:「nick」}。我還可以反序列化一個JSON字符串嗎?以某種方式直接向NSDictionary? – Nick

+2

我不明白問題是什麼。你應該能夠將'docData'發送到服務器。這是一個有效的JSON字符串。 – borrrden

回答

1

您可以讓NSJSONSerialization執行從Foundation對象到字符串的轉換。這保證了正確的轉義並使代碼更具可讀性。
如果你有一個鍵值對,如上面的示例中,你可以這樣做:

NSError* error = nil; 
NSDictionary* jsonDict = @{@"name": @"nick"}; 
NSData* putData = [NSJSONSerialization dataWithJSONObject:jsonDict options:kNilOptions error:&error]; 

您應該能夠直接將它放入您的PUT請求的內容,而無需在額外的陣列其包裝。如果處理請求的端點都需要你送一個數組,你應該創建陣列爲基礎對象(NSArray)並將其發送給服務器之前序列化的JSON:

NSArray* jsonArray = @[@{@"name": @"nick"}]; 

你的問題的標題是反序列化JSON沒有[]包裝」 - 難道不該序列化JSON沒有[]包裝」
我改變了它,如果我誤解了你的問題,請改回它。

+0

不,我認爲這是一個準確的編輯。謝謝!這是我正在尋找的。我開始做些什麼,好吧,愚蠢。這是循環訪問數組並手動創建NSDictionary。這是少得多的工作,更可讀。 +1。謝啦。 – Nick

+0

不客氣。 –

相關問題