2012-04-24 94 views
12

我NSDictionaries數組轉換成JSON數據具有以下...NSArray的轉換 - > JSON - >的NSData - > PHP服務器 - > JSON表示

創建我的數據...

NSMutableArray *arrayOfDicts = [[NSMutableArray alloc] init]; 

for (int i = 0; i < 2; i++) { 
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
            @"MySong", @"title", 
            @"MyArtist", @"artist", 
            nil]; 
    [arrayOfDicts addObject:dict];   
} 
NSArray *info = [NSArray arrayWithArray:arrayOfDicts]; 
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:info 
     options:NSJSONWritingPrettyPrinted error:&error]; 

然後發送這樣的...

NSURL *url = [NSURL URLWithString:@"http://www.mywebsite.com/index.php"]; 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
    [request setPostValue:jsonData forKey:@"songs"]; 
    [request setDelegate:self]; 
    request.tag = TAG_LOAD_SONGS; 
    [request startAsynchronous]; 

這是發送NSData的到我的服務器,但我怎麼然後用它在PHP ...它實際上只是一堆隨機數,如果我從打印我的服務器,我已經嘗試過你唱json_encode,但我不認爲這意味着原始數據...

任何幫助將是偉大的!

編輯: 這裏是php的反應......

echo $_POST['songs']; 

<5b0a2020 7b0a2020 20202274 69746c65 22203a20 224d7953 6f6e6722 2c0a2020 20202261 72746973 7422203a 20224d79 41727469 7374220a 20207d2c 0a20207b 0a202020 20227469 746c6522 203a2022 4d79536f 6e67222c 0a202020 20226172 74697374 22203a20 224d7941 72746973 74220a20 207d0a5d> 

這裏是NSLoging在Xcode響應...

NSLog(@"Info: %@", info); 

信息:( { 藝術家= MyArtist ; title = MySong; }, { artist = MyArtist; title = MySong; } )

+0

你在PHP端收到的字符串是什麼樣的? – deceze 2012-04-24 01:54:42

+0

那麼,那肯定不是JSON。看起來像你發送數據的方式是一個問題,而不是PHP。 – deceze 2012-04-24 03:00:42

+0

以及我不能弄清楚什麼是錯誤的呢?生病編輯我的問題與我如何創建我的對象... – Eric 2012-04-24 03:04:50

回答

20

原來我需要做的是這樣的:

創建我的數據:

NSMutableArray *arrayOfDicts = [[NSMutableArray alloc] init]; 

for (int i = 0; i < 2; i++) { 
    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
            @"MySong", @"title", 
            @"MyArtist", @"artist", 
            nil]; 
    [arrayOfDicts addObject:dict];   
} 
NSArray *info = [NSArray arrayWithArray:arrayOfDicts]; 

,把它像這樣:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:info 
      options:NSJSONWritingPrettyPrinted error:&error]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

    // Start request 
    NSURL *url = [NSURL URLWithString:@"http://www.mywebsite.com/index.php"]; 
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
    [request setPostValue:jsonString forKey:@"songs"]; 
    [request setDelegate:self]; 
    [request startAsynchronous]; 

的關鍵是轉換的信息到NSData,然後到我發送到我的服務器的JSON字符串,而不僅僅是發送原始的NSData

感謝大家的幫助!

+0

你爲什麼轉換到NSData的第一位?使用接口,給你一個JSON字符串,而不是。 – 2012-04-25 21:08:22

+0

啊,我看到 - 蘋果接口沒有一個接口,將產生一個JSON字符串 – 2012-04-25 21:10:00

+0

是它的漂亮笨拙.. 。哦,它是我得到的嘗試使用蘋果實現,而不是僅僅使用第三方庫! – Eric 2012-04-26 00:15:50

1

<?php $array = json_decode($_POST['songs']); ?>應該工作。

+0

當我回聲$數組什麼都沒有打印......但我知道我正在發送數據...因爲當我回聲$ _POST ['歌曲']我得到一大堆數字打印出來... – Eric 2012-04-24 02:04:37

+0

你可以在這個問題上粘貼數字...?另外,只需使用NSLog(@「%@」,info);' – QED 2012-04-24 02:07:55

+0

以及它的數千行數據......將會太大而無法發佈,請粘貼Obj-C'info'對象。基本上,如果我從xcode打印相同的數據而不是PHP,但使用NSString * string = NSString * jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];我可以看到數據的完美json字符串表示。 – Eric 2012-04-24 02:10:52

1

你不能這樣發送它。 NSJSONSerialization適用於iOS。它基本上是一個plist。你將需要一種方法來解碼它在PHP上,我懷疑它存在。相反,你需要發送一個JSON字符串。我不確定你的意思是「在標題周圍留下引號」。他們首先在那裏做什麼?你可以驗證你的原始JSON字符串here

+0

我現在發送的字符串(它通過驗證)...但字符串發送像.. [{「title」:「MySong」}]並從PHP接收像[{\「title \」:\「 MySong \「}]和我認爲」\「搞亂了解碼? – Eric 2012-04-24 03:48:12

+0

認爲我想通了......我使用json_decode(stripslashes($ host_songs)),它在解碼之前擺脫所有那些反斜槓。 – Eric 2012-04-24 03:52:08

+0

它正在逃脫。您是通過POST發送的?報價不是URL安全的。您需要首先清理字符串:將「更改爲%22 – borrrden 2012-04-24 03:52:18