2012-05-11 34 views
23

Tôi có một lớp C mục tiêu như thế nào,Chuyển đổi một iOS đối tượng khách quan c thành một chuỗi JSON

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

Tôi có một NSMutableArray của trường của lớp thông báo này. Tôi muốn tuần tự hóa tất cả các cá thể trong NSMutableArray thành một tệp JSON, sử dụng các API JSONSerialization mới trong SDK iOS 5. Tôi có thể làm cái này như thế nào ?

Đang tạo NSDictionary của mỗi khóa, bằng cách lặp qua từng trường hợp của các phần tử trong NSArray? Ai đó có thể giúp viết mã về cách giải quyết vấn đề này? Tôi không thể nhận được kết quả tốt trong Google, vì "JSON" nghiêng kết quả đến các cuộc gọi phía máy chủ và chuyển dữ liệu thay vì tuần tự hóa. Cảm ơn rất nhiều.

EDIT:

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

Trả lời

35

EDIT: Tôi đã thực hiện một ứng dụng giả mà phải là một tấm gương tốt cho bạn.

Tôi tạo một Lớp thông báo từ đoạn mã của bạn;

//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]; 
} 

Sau đó, tôi thiết lập NSArray của hai thư trong AppDelegate. Bí quyết là không chỉ các đối tượng cấp cao nhất (thông báo trong trường hợp của bạn) cần phải được serializable nhưng do đó, làm tất cả các yếu tố thông báo chứa: Thats lý do tại sao tôi tạo ra các phương pháp từ điển trong lớp 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 

Sản lượng khi tôi chạy ứng dụng là như sau:

2012-05-11 11: 58: 36,018 chồng [3146: f803] JSON Output: [ { "msg": " c " "từ": "a", "ngày": "b" }, { "msg": "f", "từ": "d", "hẹn hò":" e " } ]

ORIGINAL ANSWER:

Là tài liệu bạn đang tìm kiếm?

+0

Các OP đầu tiên sẽ cần phải chuyển đổi đối tượng của mình để một cuốn từ điển, nhưng thats khá thẳng về phía trước (một phương pháp tĩnh sẽ làm các trick) – user439407

+1

Damo: trang đó không giải thích về việc chuyển đổi một loạt các lớp tùy chỉnh để JSON . Đó là những gì tôi đang đấu tranh để tìm. –

+0

Nếu tất cả các lớp ivars của bạn là NSString sau đó nó chỉ nên làm việc kỳ diệu .... caveat: Tôi đã không cố gắng này. – Damo

8

Bây giờ bạn có thể giải quyết vấn đề này dễ dàng bằng cách sử dụng JSONModel. JSONModel là một thư viện mà sắp xếp theo thứ tự/deserialize đối tượng của bạn dựa trên Class. Bạn thậm chí có thể sử dụng non-nsobject dựa trên thuộc tính như int, shortfloat. Nó cũng có thể phục vụ JSON lồng nhau phức tạp. Nó xử lý kiểm tra lỗi cho bạn.

Ví dụ về phương pháp Deserialize. trong tập tin tiêu đề:

#import "JSONModel.h" 

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

trong tập tin thực hiện:

#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): 
} 

Serialize Ví dụ.Trong tệp triển khai:

#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

Cảm ơn! Libiary này rất hữu ích. – BlackMamba

2

Lưu ý: Điều này sẽ chỉ hoạt động với các đối tượng có thể tuần tự. Câu trả lời này đã được cung cấp ở trên trong một chỉnh sửa cho câu hỏi chính nó, nhưng tôi luôn luôn tìm kiếm câu trả lời trong "câu trả lời" phần bản thân mình ;-)

- (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

Xin chào. Làm thế nào để chuyển đổi mảng của NSObject. Cảm ơn bạn :) – kemdo

+0

hey @kemdo - không chắc chắn - và tôi không làm ios dev nữa, vì vậy có thể không thực sự nói .... Chúc may mắn! –

0

Đây là một thư viện tôi được sử dụng trong các dự án của tôi BWJSONMatcher, có thể giúp bạn dễ dàng kết hợp chuỗi json của bạn với mô hình dữ liệu của bạn mà không có nhiều hơn một dòng mã.

... 
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]; 
... 
Các vấn đề liên quan