2012-05-11 50 views
23

我有一個客觀的C級等,轉換在iOS目標C的對象到一個JSON字符串

@interface message : NSObject { 
NSString *from; 
NSString *date; 
NSString *msg; 
} 

我有該消息的類的實例的一個NSMutableArray。我想使用iOS 5 SDK中的新JSONSerialization API將NSMutableArray中的所有實例序列化爲JSON文件。我怎樣才能做到這一點 ?

通過遍歷NSArray中元素的每個實例來創建每個鍵的NSDictionary?有人可以幫助解決這個問題的代碼?我無法在Google中取得好成績,因爲「JSON」會將結果歪曲爲服務器端調用和數據傳輸,而不是序列化。非常感謝。

編輯:

NSError *writeError = nil; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:notifications options:NSJSONWritingPrettyPrinted error:&writeError]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
NSLog(@"JSON Output: %@", jsonString); 

回答

35

編輯:我做了一個假的應用程序,應該是你一個很好的例子。

我從你的代碼片段創建一個消息類;

//Message.h 
@interface Message : NSObject { 
    NSString *from_; 
    NSString *date_; 
    NSString *msg_; 
} 

@property (nonatomic, retain) NSString *from; 
@property (nonatomic, retain) NSString *date; 
@property (nonatomic, retain) NSString *msg; 

-(NSDictionary *)dictionary; 

@end 

//Message.m 
#import "Message.h" 

@implementation Message 

@synthesize from = from_; 
@synthesize date = date_; 
@synthesize msg = mesg_; 

-(void) dealloc { 
    self.from = nil; 
    self.date = nil; 
    self.msg = nil; 
    [super dealloc]; 
} 

-(NSDictionary *)dictionary { 
    return [NSDictionary dictionaryWithObjectsAndKeys:self.from,@"from",self.date, @"date",self.msg, @"msg", nil]; 
} 

然後我在AppDelegate中設置了兩條消息的NSArray。訣竅是,不僅頂級對象(您的案例中的通知)需要可序列化,而且通知所包含的所有元素也是如此:這就是爲什麼我在Message類中創建了字典方法。

//AppDelegate.m 
... 
Message* message1 = [[Message alloc] init]; 
Message* message2 = [[Message alloc] init]; 

message1.from = @"a"; 
message1.date = @"b"; 
message1.msg = @"c"; 

message2.from = @"d"; 
message2.date = @"e"; 
message2.msg = @"f"; 

NSArray* notifications = [NSArray arrayWithObjects:message1.dictionary, message2.dictionary, nil]; 
[message1 release]; 
[message2 release]; 


NSError *writeError = nil; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:notifications options:NSJSONWritingPrettyPrinted error:&writeError]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
NSLog(@"JSON Output: %@", jsonString); 

@end 

當我運行該應用程序的輸出是這樣的:

2012-05-11 11:58:36.018堆棧[3146:F803] JSON輸出:[ { 「msg」 中:「 C 「 」從「: 」一「, 」日期「: 」b「 的 }, { 」msg「 中: 」F「, 」從「: 」d「, 」日期「:」 電子「 } ]

原文答案:

this您正在查找的文檔是?

+0

的OP首先需要將自己的對象轉換爲一個字典,但那是非常簡單的(靜態方法就可以了) – user439407

+1

大摩:該網頁不會對自定義類的數組轉換成JSON解釋。這正是我正在努力尋找的。 –

+0

如果你的所有類的ivars都是NSString,那麼它應該只是神奇的工作....警告:我沒有試過這個。 – Damo

8

現在,您可以使用JSONModel輕鬆解決此問題。 JSONModel是一個通用的基於Class序列化/反序列化對象的庫。您甚至可以使用基於非,shortfloat之類的屬性的非nsobject。它也可以提供嵌套複雜的JSON。它爲您處理錯誤檢查。

反序列化示例。在頭文件:

#import "JSONModel.h" 

@interface Message : JSONModel 
@property (nonatomic, strong) NSString* from; 
@property (nonatomic, strong) NSString* date; 
@property (nonatomic, strong) NSString* message; 
@end 

在實現文件:

#import "JSONModelLib.h" 
#import "yourPersonClass.h" 

NSString *responseJSON = /*from somewhere*/; 
Message *message = [[Message alloc] initWithString:responseJSON error:&err]; 
if (!err) 
{ 
    NSLog(@"%@ %@ %@", message.from, message.date, message.message): 
} 

序列化實施例。在執行文件中:

#import "JSONModelLib.h" 
#import "yourPersonClass.h" 

Message *message = [[Message alloc] init]; 
message.from = @"JSON beast"; 
message.date = @"2012"; 
message.message = @"This is the best method available so far"; 

NSLog(@"%@", [person toJSONString]); 
+1

謝謝!這個論點非常有用。 – BlackMamba

2

注意:這隻適用於可序列化的對象。這個答案是在編輯到問題本身上面提供的,但我總是尋找自己的「答案」部分答案;-)

- (NSString*) convertObjectToJson:(NSObject*) object 
{ 
    NSError *writeError = nil; 

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object options:NSJSONWritingPrettyPrinted error:&writeError]; 
    NSString *result = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

    return result; 
} 
+0

嗨。如何轉換NSObject數組。謝謝你:) – kemdo

+0

嘿@kemdo - 不知道 - 我不再做ios開發,所以不能說真的。祝你好運! –

0

這是我在我的項目BWJSONMatcher使用的庫,它可以幫助您只需使用一行代碼即可輕鬆將您的json字符串與數據模型進行匹配。

... 
NSString *jsonString = @"{your-json-string}"; 
YourValueObject *dataModel = [YourValueObject fromJSONString:jsonString]; 

NSDictionary *jsonObject = @{your-json-object}; 
YourValueObject *dataModel = [YourValueObject fromJSONObject:jsonObject]; 
... 
YourValueObject *dataModel = instance-of-your-value-object; 
NSString *jsonString = [dataModel toJSONString]; 
NSDictionary *jsonObject = [dataModel toJSONObject]; 
...