2012-02-04 95 views
5

我目前正在嘗試使用JSON進行Internet數據傳輸。我已經成功接收JSON字符串並將其轉換爲NSDictionary,但尚未能夠解決如何將對象的數組或字典轉換爲JSON表示。Objective-C/iOS:將對象數組轉換爲JSON字符串

我已閱讀大量文章和文章,解釋如何創建鍵/值對的NSDictionary,然後轉換爲JSON,這對於一個簡單的數組來說工作正常,但如何在數組中實現這一點或對象的字典。

因此,例如,我有對象的「接觸」的陣列,這是我將隨後要轉換成JSON字符串作爲這樣:

"contacts":{ 
    "contact":[ 
    { 
     "id":"1" 
     "first_name":"john", 
     "last_name":"citizen", 
     "phone":"9999 9999" 
    } 
    { 
     "id":"1" 
     "first_name":"jane", 
     "last_name":"doe", 
     "phone":"8888 8888" 
    } 
    ] 
} 

我有一個NSMutableDictionary這是填充的接觸的列表中對象:

NSMutableDictionary* contactsToBeSynced = [[NSMutableDictionary alloc] init]; 
    //Populate dictionary with contact objects. 
    contactsToBeSynced = self.getNonSynchronisedData; 

然後我試圖改變與NSJSONSerialization法對象的字典,但它因錯誤而失敗。

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

有沒有人能夠成功地做到這一點?將不勝感激一些幫助或點在正確的方向。乾杯。

+0

這是爲了學習還是你只想完成工作?因爲那裏有大約5個用於Objective-C的好JSON庫。 – user123444555621 2012-02-04 09:13:20

回答

5

關於你的結構 - 你contactsToBeSynced必須NSDictionary類的,和contact應包含不同的聯繫人NSDictionary對象的NSArray。順便說一下,你有沒有試過JSONKit?它的序列化比標準的NSJSONSerialization更好。

1

我的工作了......

我創建聯繫人對象的NSArray,並使用SBJson框架,SBJsonWriter:

SBJsonWriter *writer = [[SBJsonWriter alloc] init]; 
NSString *jsonString = [writer stringWithObject:arr]; 

我有一個JSON字符串的聯繫人列表。

0

請查看我對「SBJsonWriter Nested NSDictionary」問題的回答。它說明如何正確使用SBJsonWriter。

它包括SBJsonWriter錯誤檢查!和有關與NSDate的,浮動等SBJsonWriter行爲提醒的一些作品..

摘錄:

NSDictionary* aNestedObject = [NSDictionary dictionaryWithObjectsAndKeys: 
             @"nestedStringValue", @"aStringInNestedObject", 
             [NSNumber numberWithInt:1], @"aNumberInNestedObject", 
           nil]; 

NSArray * aJSonArray = [[NSArray alloc] initWithObjects: @"arrayItem1", @"arrayItem2", @"arrayItem3", nil]; 

NSDictionary * jsonTestDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
            @"stringValue", @"aString", 
            [NSNumber numberWithInt:1], @"aNumber", 
            [NSNumber numberWithFloat:1.2345f], @"aFloat", 
            [[NSDate date] description], @"aDate", 
            aNestedObject, @"nestedObject", 
            aJSonArray, @"aJSonArray", 
            nil]; 
0

一般情況下,你寫的每一個這需要關注的領域,將它們插入類toDictionary方法在字典中。對於在插入前轉換爲NSNumber的數字字段。如果任何字段是對象,則調用該對象上的toDictionary方法並將結果插入字典中。如果你有一個對象數組,你需要編寫一個循環,但它沒有任何異國情調。

要反轉操作,請爲每個班級編寫initWithDictionary方法。

相關問題