2014-03-02 59 views
1

我嘗試JSON編碼NSDictionary到NSArray上傳到PHP Web服務。如何JSON編碼數組從iOS到PHP

這是我JSON如何編碼我的NSArray:

NSError * error; 
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:my_array_1 options:0 error:&error]; 
NSString * jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
jsonString = [jsonString stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; 

然後我插入這個JSON字符串到另一個陣列由:

NSString * jsonRequest = [NSString stringWithFormat: @"{\"request\":\"syncBookmark\",\"bookmark_array\":\"%@\",\"user_id\":\"%@\"}", jsonString, user_id, nil]; 
NSData * requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]]; 

之前,我請求web服務的JSON編碼字符串是像:

{"request":"syncBookmark","bookmark_array":"[{\"PostId\":\"4\",\"last_edit_date\":\"2014-03-03 01:05:37\",\"BookmarkId\":\"1\",\"last_sync_date\":\"\",\"is_active\":\"1\"}]","user_id":"7"} 

我可以在PHP中正確回顯'user_id','7',但是當我檢查t他在PHP數組 - is_array($ bookmark_array)它只是返回FALSE。我是否錯誤地將數組放入數組中?

+0

如果你打算已經「嵌入/嵌套JSON」,其中的數據實際上是JSON編碼的兩倍請發表你的PHP代碼 –

+1

一切額外操作時,才需要。這是不尋常的,所以你很可能不應該這樣做。而且,正如Rob所言,只需通過兩次通過JSON編碼運行數據,就可以更有效,更可靠地完成。通常,只需將數組放在字典中(或放入另一個數組中),將數組放入字典中,然後使用JSON編碼整個事物--JSON編碼器知道如何處理嵌套數組/字典。 –

+0

(一旦你理解了,JSON非常簡單易用,如果你還沒有這樣做,去json.org花5-10分鐘學習語法。然後理解一個JSON「對象」完美地映射到iOS「NSDictionary」,並且JSON「數組」完美映射到iOS NSArray。所以,只要你有一個好的JSON編碼器/解碼器,在這兩種形式之間來回轉換就是微不足道的 - 在99%的時間內不需要其他操作。) –

回答

4

不要打擾做stringByReplacingOccurrencesOfString的東西。讓NSJSONSerialization爲你做所有必要的報價。

所以,如果你真的需要jsonString爲你的PHP將遞歸未編碼,只是JSON編碼數組,然後一個字符串放進了另一個字典,然後再編碼:

NSError *error; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:my_array_1 options:0 error:&error]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

NSDictionary *dictionary = @{@"request"  : @"syncBookmark", 
          @"bookmark_array" : jsonString, 
          @"user_id"  : user_id}; 

NSData *finalData  = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; 

這應該創造一個有效載荷,就像你在你的問題中說的那樣。

話雖如此,一個更合乎邏輯的做法是:

NSError *error; 

NSDictionary *dictionary = @{@"request"  : @"syncBookmark", 
          @"bookmark_array" : my_array_1, 
          @"user_id"  : user_id}; 

NSData  *finalData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; 

如果這就是你產生有效載荷,然後你的PHP就不必多次調用做json_decode

5

這是因爲您輸入的JSON字符串作爲字符串,它顯然是由stringWithFormat方法逃脫。

您應該創建一個NSDictionary和序列化到一起。因此,不是序列化my_array_1變量,而是序列化字典。

創建詞典:

NSDictionary* dictionary = @{ @"request" : @"syncBookmark", @"bookmark_array" : my_array_1 }; 

然後序列化詞典:

NSError * error; 
NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; 
NSString * jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

這是序列化JSON對象,而不是插入序列化對象到另一個字符串中的正確方法。雖然我明白你爲什麼想這樣做。