2015-08-26 1 views
3

Я разрабатываю приложение IOS в Objective C, в котором я вызываю URL-адрес для извлечения массива объектов JSON (ресторанов). Я хочу проанализировать их на объективе C Модель. Используя их для заполнения на UICollectionView, которые я уже разработал. Моя задача требует, чтобы я проектировал эту модель для хранения объектов Json, а затем использовал их для заполнения на UICollectionView. Я не знаю, как достичь этого в Objective-C, пожалуйста, помогите мне в этом. Полученный JSON выглядит следующим образом.создать модель данных для JSON - IOS/Objective-C

"restaurants" : [ 
{ 
    "name": "Burger Bar", 
    "backgroundImageURL": "http://somthing.com/Images/1.png", 
    "category" : "Burgers", 
     "contact": { 
      "phone": "1231231231", 
      "formattedPhone": "(123) 123-1231", 
      "twitter": "1twitter" 
     }, 
     "location": { 
      "address": "5100 Belt Line Road, STE 502", 
      "crossStreet": "Dallas North Tollway", 
      "lat": 32.950787, 
      "lng": -96.821118, 
      "postalCode": "75254", 
      "cc": "US", 
      "city": "Addison", 
      "state": "TX", 
      "country": "United States", 
      "formattedAddress": [ 
       "5100 Belt Line Road, STE 502 (Dallas North Tollway)", 
       "Addison, TX 75254", 
       "United States" 
      ] 
     } 
}, 
{ 
    "name": "seafood Kitchen", 
    "backgroundImageURL": "http://somthing.com/Images/2.png", 
    "category": "Seafood", 
     "contact": { 
      "phone": "3213213213", 
      "formattedPhone": "(321) 321-3213", 
      "twitter": "2twitter" 
     }, 
     "location": { 
      "address": "18349 Dallas Pkwy", 
      "crossStreet": "at Frankford Rd.", 
      "lat": 32.99908456526653, 
      "lng": -96.83018780592823, 
      "postalCode": "33331", 
      "cc": "US", 
      "city": "Dallas", 
      "state": "TX", 
      "country": "United States", 
      "formattedAddress": [ 
       "18349 Dallas Pkwy (at Frankford Rd.)", 
       "Dallas, TX 75287", 
       "United States" 
      ] 
     } 
} 

]

Ниже кода показывает, как вызвать URL и получить и напечатать синтаксического анализа JSON объектов.

NSString *urlString = @"http://somthing.com/Images/collection.json"; 
NSURL *url = [NSURL URLWithString:urlString]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
[NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
          if (!error) { 
           NSError* parseError; 
           id parse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&parseError]; 
           NSLog(@"%@", parse); 
          } 
         }]; 

Как создать модель данных ресторан. Или есть ли другой способ этого?

+0

Что вы имеете в виду с помощью модели Objective-C? Вы имеете в виду только обычный класс? Или вы хотите сохранить это с помощью Core Data? – michaelrccurtis

+0

Извините за двусмысленность, я хотел сказать, обычный класс. – hexagon

ответ

0

Вы можете разобрать данные, которые вы получите в вашей функции обратного вызова к объекту NSDictionary:

NSData *response = someData; // data you are getting in callback 
NSError *error; 
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:response options:kNilOptions error:&error]; 
NSArray *restaurants = [json objectForKey:@"restaurants"]; 
1

Глядя на пример JSON, вы получаете множество ресторанов в соответствии с [] скобках. Вы можете получить массив с этим:

NSArray *restArray= [parse objectForKey:@"restaurants"]; 

Теперь вы хотите перебрать этот массив и проанализировать структуру как следующее:

for (NSDictionary *restaurant in restArray){ 
    NSString* name = [restaurant objectForKey:@"name"]; 
    NSDictionary* location = [restaurant objectForKey:"location"]; 
    //etc... 
} 
+0

спасибо за это. Я уверен, что не использовать пользовательские модели работает с этим кодом, но моя задача требует, чтобы я использовал пользовательскую модель, как ответил @poojathorat. Но это не работает, пожалуйста, посмотрите комментарий на этот ответ, возможно, вы можете понять больше о том, чего я хочу. Спасибо – hexagon

0

магазин массив ресторанов из JSON в вашей модели объекта и то вы можете получить данные, необходимые для вашего вида коллекции, из модели, чтобы все элементы синтаксического анализа оставались в вашей модели.

.h 
@interface Model : NSObject 

@property(nonatomic,strong)NSArray *restaurants; 

@end 

.m 
@implementation Model 

-(NSIteger)getRestaurantsCount{ 
    return restaurants.count; 
} 

//getRestaurantAtIndex: 
//getRestaurantNameAtIndex: 

@end 
2

Использование JSONModel https://github.com/icanzilb/JSONModel

.h файл

#import "JSONModel.h" 




@interface location : JSONModel 
{ 

} 

@property (nonatomic,strong) NSString *address; 
@property (nonatomic,strong) NSString *crossStreet; 
@property (nonatomic,strong) NSString *lat; 
@property (nonatomic,strong) NSString *lng; 
@property (nonatomic,strong) NSString *postalCode; 
@property (nonatomic,strong) NSString *cc; 
@property (nonatomic,strong) NSString *city; 
@property (nonatomic,strong) NSString *state; 
@property (nonatomic,strong) NSString *country; 
@property (nonatomic,strong) NSArray *formattedAddress; 
@end 




@interface contact:JSONModel 
{ 

} 
@property (nonatomic,strong) NSString *phone; 
@property (nonatomic,strong) NSString *formattedPhone; 
@property (nonatomic,strong) NSString *twitter; 
@end 

@interface Restaurant : JSONModel 
@property (nonatomic,strong) location *objectLocation; 
@property (nonatomic,strong) contact *objContact; 
@property (nonatomic,strong) NSString *name; 
@property (nonatomic,strong) NSString *backgroundImageURL; 
@property (nonatomic,strong) NSString *category; 

@end

файл .m

@implementation Restaurant 
-(id)init{ 
self = [super init]; 
if (self) { 
    _category = @""; 
    _name = @""; 
    _backgroundImageURL = @""; 


} 
return self; 
} 
@end 
@implementation contact 
-(id)init{ 
self = [super init]; 
if (self) { 
    _phone = @""; 
    _formattedPhone = @""; 
    _twitter = @""; 


} 
return self; 
} 



@end 
@implementation location 
-(id)init{ 
self = [super init]; 
if (self) { 
    _address = @""; 
    _crossStreet = @""; 
    _lat = @""; 
    _lng= @""; 
    _postalCode = @""; 
    _city = @""; 
    _state = @""; 
    _cc = @""; 
    _country = @""; 






} 
return self; 
} 

//objects is the response object 
NSArray* models = [Restaurant arrayOfModelsFromDictionaries: objects]; 
+0

Я попробовал вышеуказанный код. ** модели ** результаты будут пустыми. объект ответа здесь NSData, который я конвертирую с использованием этого кода и используя ** parse ** вместо ** объектов **. 'id parse = [NSJSONSerialization JSONObjectWithData: параметры данных: NSJSONReadingMutableContainers error: & parseError];' и 'NSArray * models = [Restaurant arrayOfModelsFromDictionaries: parse]'. На стороне примечания я должен получить JSON на NSArray, если я не использую какую-либо пользовательскую модель данных, например Restaurant в этом случае. Но мне нужна моя модель ** Restaurant **. Я помещаю весь этот код в ** ViewDidLoad **. – hexagon

+0

как-то ** numberOfItemsInSection ** сначала вызывается, где я пытаюсь присвоить номер [count count], который всегда возвращает 0. где я ошибаюсь? – hexagon

2

Вы можете использовать Json2Model здесь https://github.com/fredlo2010/Json2Model

Он будет генерировать 4 объекта для вас: Restaurants.h Restaurant.h Contact.h Location.h

Вот пример Contact.h и Contact.n

#import <Foundation/Foundation.h> 

@interface Contact : NSObject 

@property (strong, nonatomic) NSString *twitter; 
@property (strong, nonatomic) NSString *phone; 
@property (strong, nonatomic) NSString *formattedPhone; 

- (instancetype) initWithTwitter: (NSString *)twitter andPhone: (NSString *)phone andFormattedPhone: (NSString *)formattedPhone; 

@end 

#import "Contact.h" 

@implementation Contact 

- (instancetype) initWithTwitter: (NSString *)twitter andPhone: (NSString *)phone andFormattedPhone: (NSString *)formattedPhone { 

    self = [super init]; 

    if (self) { 
     self.twitter = twitter; 
     self.phone = phone; 
     self.formattedPhone = formattedPhone; 
    } 
    return self 
} 

@end 
3

Нет никакой необходимости в какой-либо внешней библиотеке. Посмотрите на данные, которые вы получаете, и очевидно, что вам нужен класс, каждый из которых представляет контакт, местоположение, ресторан, и вы хотите перевести ответ JSON в множество ресторанов. Очевидно, какие свойства должны иметь контакты, местоположение и ресторан.

Для каждого класса вам не нужен метод init, поэтому объявите метод init с флагами, которые делают его использование незаконным. Для каждого класса объявите метод initWithJSONDictionary: (NSDictionary *) dict, который принимает соответствующий словарь в качестве аргумента, извлекает все свойства из словаря, регистрирует, если значения не являются тем, что вы ожидаете, и возвращает nil, если данные неисправны.

Использование NSJSONSerialization для анализа данных JSON, проверьте, что это массив, и каждый элемент массива является словарем, и вызывают [[MyRestaurant alloc] initWithJSONDictionary: ...] для каждого словаря.

Это абсолютно просто, и для чего-то простого, подобного вашему делу, для этого вам потребуется час или два, чтобы написать код для предотвращения пули.

+0

Не могли бы вы представить пример этого фрагмента кода? – freddieoh

Смежные вопросы