2011-02-11 39 views
6

Tôi đang cố gắng ánh xạ động thông tin JSON vào các đối tượng khác nhau. Nhưng tôi không thể hiểu được làm thế nào để có được toàn bộ tình trạng con trỏ dưới sự kiểm soát, như những gì tôi đã hy vọng sẽ làm việc không.Ánh xạ JSON mục tiêu-C DRY và tạo đối tượng

Cho đến nay phương pháp của tôi là tạo một từ điển cho từng đối tượng, ánh xạ các con trỏ biến tới các khóa JSON tương đương. Trong trình ánh xạ JSON của tôi, tôi có một phương thức, parseJSONFromDictionary:withObject được cho là lặp qua từ điển được trả về bởi JSONValue của SBJSON và gán các giá trị thích hợp cho các biến thích hợp trong đối tượng đã cho.

-(NSObject *)parseJSONFromDictionary:(NSDictionary *)dict withObject:(NSObject *)start{ 
    for (NSString *key in dict) { 
     if ([[self.mappings objectForKey:key] isMemberOfClass:[NSString class]]) { 
      start.[self.mappings objectForKey:key] = [[dict valueForKey:key] stringValue]; 
     } 
    } 
    return start; 
}

mappings là từ điển mà có các biến và các phím json, và dict là những gì được trở về từ phân tích cú pháp JSON.

Vấn đề lớn là tôi không thể làm start.[self.mappings objectForKey:key]. Tôi không biết nhiều về C, và rõ ràng là tôi không biết đủ về con trỏ, vậy làm thế nào tôi có thể tạo ra loại hệ thống này? Tôi biết đó không phải là cách đúng đắn để làm điều này, nhưng cách nào đúng? Tôi biết nó có thể được thực hiện, như RestKit hiện nó, nhưng họ không hỗ trợ OAuth vì vậy tôi thật không may không thể sử dụng khuôn khổ đáng yêu của họ.

Lý do tôi đi tuyến đường này là do API tôi đang làm việc hiện đang ở giai đoạn alpha. Tôi muốn có thể dễ dàng thích nghi với bất kỳ thay đổi nào trong tương lai mà không phải viết lại nhiều dòng mã. Tôi cũng muốn bắt đầu lập trình DRY-ly. Tôi biết phân tích cú pháp JSON rất lặp đi lặp lại và tôi muốn tìm cách giảm số tiền trên không.

Cảm ơn mọi sự giúp đỡ!


EDIT: Có vẻ như có một số nhầm lẫn về những gì tôi đang yêu cầu. Tôi không cần trợ giúp phân tích cú pháp JSON. Tôi đang sử dụng SBJSON rồi. Tôi không cần trợ giúp để đưa ra yêu cầu, tôi đã sử dụng JDG's OAuthConsumer framework. Tôi chỉ có thể sử dụng các khung hỗ trợ OAuth 2.0.

tôi làm cần sự giúp đỡ tìm hiểu làm thế nào để ngăn chặn này:

-(Class1 *)parseJsonForClass1:(NSString *)inputString { 
    NSDictionary *outputDict = [inputString JSONValue]; 
    Class1 *instance1 = [self mapObjectsForClass1From:outputDict]; 
    return instance1; 
} 

-(Class2 *)parseJsonForClass2:(NSString *)inputString { 
    NSDictionary *outputDict = [inputString JSONValue]; 
    Class2 *instance2 = [self mapObjectsForClass2From:outputDict]; 
    return instance2; 
} 

-(Class3 *)parseJsonForClass3:(NSString *)inputString { 
    NSDictionary *outputDict = [inputString JSONValue]; 
    Class2 *instance3 = [self mapObjectsForClass3From:outputDict]; 
    return instance3; 
} 

-(Class1 *)mapObjectsForClass1From:(NSDictionary *)dict { 
    Class1 *object1 = [[Class1 alloc] init]; 
    object1.name = [[dict valueForKey:@"name"] stringValue]; 
    object1.date = [[dict valueForKey:@"date"] stringValue]; 
    object1.objId = [[dict valueForKey:@"id"] intValue]; 

    return object1; 
} 

-(Class2 *)mapObjectsForClass2From:(NSDictionary *)dict { 
    Class2 *object2 = [[Class2 alloc] init]; 
    object2.something = [[dict valueForKey:@"something"] stringValue]; 
    object2.title = [[dict valueForKey:@"title"] stringValue]; 
    object2.imageUrl = [[dict valueForKey:@"image_url"] stringValue]; 

    return object2; 
} 

-(Class3 *)mapObjectsForClass3From:(NSDictionary *)dict { 
    Class3 *object3 = [[Class3 alloc] init]; 
    object3.foo = [[dict valueForKey:@"bar"] stringValue]; 
    object3.flag = [[dict valueForKey:@"is_member"] boolValue]; 
    object3.obj1 = [[Class1 alloc] init]; 
    object3.obj1 = [self mapOjectsForClass1From:[dict objectForKey:@"name1"]]; 

    return object3; 
}

Vì vậy, xin vui lòng cho tôi biết nếu bạn có bất kỳ đề xuất về cách kết hợp các loại phương pháp thành 1 phương pháp ...

+0

Bạn đã xem https://github.com/RestKit/RestKit chưa? – Brenden

+0

Tôi đã xem Restkit. Tôi không thích những gì nó đã làm, và tôi vẫn không. Không bao giờ trong cuộc sống của tôi có tôi nhìn thấy một đường cong phân bổ bộ nhớ hoàn hảo hơn so với RestKit thổi phồng các đối tượng trong một vòng lặp. – MishieMoo

Trả lời

2

Tôi gần đây đã thấy ai đó thực hiện việc này bằng cách sử dụng Objective Resources. Trong khi đó là một cách hay để truy cập các đối tượng, một số việc thực hiện có thể lộn xộn. Và bạn phải sử dụng mọi thứ mà máy chủ gửi cho bạn, cho dù bạn có thích hay không. Tôi sẽ tránh xa điều này ngay bây giờ.

0

Ngoài ra, hãy xem HTTPRiot để đảm bảo hầu hết các nỗ lực liên lạc khỏi vai của bạn, xử lý kết nối không đồng bộ, v.v. Tutorial about JSON communications với iOS (Ruby cong, nhưng tối thiểu) cho biết cách sử dụng; một số mã đã lỗi thời, nhưng tổng thể nhận được thông báo qua.

+0

Tôi đã thực hiện một tấn JSON làm việc trước đây, vì vậy tôi biết cách phân tích cú pháp JSON thành các đối tượng. Tôi chỉ cố gắng tìm ra cách để không có các chức năng riêng cho từng đối tượng mà tôi đang cố gắng có được. Ngoài ra, tôi cần phải sử dụng OAuth vì vậy tôi không thể sử dụng HTTPRiot, hoặc bất kỳ khung công tác khác UNLESS họ đã có OAuth được xây dựng (lưu ý: Tôi chưa tìm thấy một trong đó) – MishieMoo

+0

Sau đó, tôi thứ hai đề nghị khác và nhìn vào SBJSON (aka JSON Framework). Nó liên tục quản lý đối tượng JSON marshaling trong khi cho phép bạn sửa đổi hệ thống ống nước cơ bản của OAuth. – yuvalz

+0

Tôi đã sử dụng SBJSON. Điều này liên quan đến việc tạo đối tượng SAU JSON được phân tích cú pháp, không phải là phân tích cú pháp JSON. – MishieMoo

5

Bạn có thể sử dụng KVC. Tạo một setter cho mỗi giá trị trong từ điển JSON mà bạn muốn chèn vào đối tượng của mình và sử dụng -setValue:forKey: để thực sự đặt các giá trị, ví dụ:

-(NSObject *)parseJSONFromDictionary:(NSDictionary *)dict withObject:(NSObject *)start 
{ 
    for (NSString *key in [dict allKeys]) 
    { 
     NSString* propertyName = [[self mappings] objectForKey: key]; 
     [start setValue: [dict objectForKey: key] forKey: propertyName]; 
     // the above line will throw an exception if start does not have a set accessor for property 
    } 
    return start; 
} 
+0

Đó có thể chính xác là những gì tôi đang tìm kiếm! Tôi chắc chắn sẽ kiểm tra điều này một khi tôi trở lại mac của tôi ở nhà. – MishieMoo

+0

Thay vì viết phương thức setter phụ (tôi đang cố viết ít mã lặp lại nhất có thể), một phương thức như thế này có phù hợp để sử dụng setValue: forKey http://www.otakunozoku.com/objective-c-class -tính chất/ ?? – MishieMoo

+0

vì vậy điều này chắc chắn là dọc theo dòng mà tôi đang tìm kiếm. Việc thực hiện của tôi đang chạy vào issus với việc tạo các đối tượng khác trong hàm, chủ yếu liên quan đến các đối tượng được tạo trong một mảng. Một số các cuộc gọi JSON trả về các mảng từ điển mà sau đó cần phải được ánh xạ vào các đối tượng khác nhau ... Bất cứ nơi nào để chỉ cho tôi? – MishieMoo

6

Tôi biết đây là một chủ đề cũ nhưng được cho là đặt ở đây, mã ở đây trong https://github.com/mystcolor/JTObjectMapping sẽ có thể trợ giúp trong ánh xạ đối tượng. Bạn sẽ muốn có ánh xạ và đối tượng tùy chỉnh của bạn sẵn sàng trước khi bạn sử dụng. Tôi tìm thấy điều này trên googling .... havent sử dụng nó mặc dù. Cần dùng thử.

Các vấn đề liên quan