iPhone SDK primii pași cu date JSON Utilizând API-ul Twitter

API-urile accesibile pe Web oferă o multitudine de resurse pentru extinderea funcționalității aplicațiilor iPhone. Aceste API tind să fie consumate în două formate de date primare: XML și JSON. SDK-ul iPhone are suport integrat pentru parsarea XML, iar acest lucru va fi acoperit într-un tutorial separat. În acest tutorial, ne vom concentra pe adăugarea suportului JSON pentru aplicațiile dvs. iOS, demonstrând cum să creați o aplicație client pentru citirea Twitter.

Introducere

Cadrul JSON este un cadru extrem de popular. Se utilizează pentru alimentarea unei mari părți din aplicațiile utilizate în mod obișnuit în App Store, inclusiv aplicația Facebook, aplicația Hărți Google și aproape toți clienții Twitter.

De ce JSON?

Există câteva motive pentru a alege JSON peste XML. Primul motiv JSON este preferat deoarece fișierele JSON sunt, în general, mai mici în dimensiunea fișierelor decât omologii lor XML, iar acest lucru are drept rezultat mai puțin timp de încărcare. Un alt motiv care merită luat în considerare este că sistemul de notificare Push de la Apple funcționează cel mai bine cu sarcini utile JSON.

1. Noțiuni de bază

Crearea unui proiect Xcode

  1. Creați un nou proiect Xcode pe care îl alegeți. Voi folosi modelul View-Based.
  2. Descărcați JSON Framework aici.

Adăugarea cadrului

Adăugarea cadrului este simplă. Trebuie doar să trageți fișierele în proiectul dvs. Există o opțiune de a conecta biblioteca la proiectul dvs., dar această opțiune este acum depreciată și nu este acceptată.

  1. Glisați folderul JSON din DMG și fixați-l în proiectul dvs. Xcode. Puteți să o adăugați la grupul "Alte surse" dacă doriți.
  2. Selectați opțiunea "Copiați articolele în folderul grupului de destinație" când vi se solicită.
  3. Adăuga:
     #import "JSON.h" 

    în fișierele sursă în care veți folosi cadrul.

2. Folosind Biblioteca JSON

Un exemplu de mesaj JSON

Următoarea este un mesaj JSON exemplu care reprezintă ce poate arăta un obiect persoană:

 "prima adresă": "John", "lastName": "Smith", "vârstă": 25, : "NY", "postalCode": "10021", "phoneNumber": "type": "home" număr ":" 646 555-4567 "] 

Parsarea unei șiruri JSON

Pentru a analiza cele de mai sus, vom încărca mai întâi mesajul JSON într-un NSString:

 NSString * jsonString = [[NSString alocare] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @ "data" deType: @ "json"] codare: eroare NSUTF8StringEncoding: & eroare]; 

Din examinarea mesajului JSON de probă, putem vedea că datele sunt încapsulate cu ambele paranteze (de ex. [] ) și bretele (de ex. ). Parantezele sunt matrice de date, iar bretelele sunt dicționarele datelor. După cum puteți vedea, suntem capabili să creeze array-uri de dicționare, iar obiectele dicționarului pot conține matrice pentru mai multe valori.

În exemplul de mai sus, avem un dicționar de contact cu chei, cum ar fi numele, prenumele etc. Cheia de adresă indică un alt dicționar care conține propriile perechi cheie-valoare. Tasta telefonNumber din dicționar contine o serie de dicționare.

Pentru a analiza o matrice folosim:

 NSArray * rezultate = [jsonString JSONValue]; 

Pentru a parsa un Dicționar, folosim:

 NSDictionary * dicționar = [jsonString JSONValue]; NSArray * keys = [dicționarul allKeys]; // cheile pentru dicționarul dvs. 

Alegeți una de care aveți nevoie în funcție de obiectul rădăcină. De exemplu, în cazul în care API vă întoarce o listă de contacte, veți primi din nou o serie de dicționare pentru persoanele de contact. În mod similar, dacă cereți o coincidență de twitter, primiți o serie de tweet-uri în cazul în care fiecare tweet este un dicționar.

Crearea unui șir JSON

Crearea unui șir JSON este foarte simplă și simplă. Creați fie un NSDictionary cu tastele și valorile corespunzătoare, fie un NSArray cu lista de obiecte. Acest proces este destul de similar cu modul în care am analizat JSON în pasul anterior.

Ați crea un dicționar cu datele dvs..

 NSDictionary * contactData = [NSDictionary dicționarWithObjectsAndKeys: _titleField.text, @ title ", _summaryField.text, @" summary ", _urlField.text, @ url, _phoneField.text, @ phone, _bdayField.text, ziua de naștere ", _addrField.text, @" address ", nil]; 

Adăugați dicționarul de date nou creat în clasa sa

 NSDictionary * finalData = [NSDictionary dicționarWithObject: contactData pentruKey: @ "contact"]; 

Apoi generați reprezentarea JSON a dicționarului dvs. de clasă.

 NSString * newJSON = [finalData JSONReprezentare]; 

De asemenea, puteți să creați în mod corespunzător matricele și dicționarele de cuiburi.

Notă: Nu există nicio metodă în cadrul JSON care să valideze dacă un mesaj este valid JSON.

3. Punerea în comun a tuturor

Să creați o aplicație iPhone simplă care să arate o listă cu ultimele 5 tweets care conțin mobtuts.

Vom folosi API-ul Căutare Twitter pentru simplitate, deoarece nu necesită autentificare sau autorizare.

A Tweet

Adresa URL a solicitării noastre este:

 http://search.twitter.com/search.json?q=mobtuts&result_type=recent

Acest lucru ne va întoarce un rezultat dicționar care conține o serie de tweet-uri.

Pentru a face viața puțin mai ușoară, să ne concentrăm doar pe urlul de imagine al profilului utilizatorului, pe textul tweet și pe numele de twitter al utilizatorului.

Un singur tweet rezultant arata astfel:

 "profile_image_url": "http://a3.twimg.com/profile_images/949941117/zucker_normal.jpg", "created_at": "Joi, 10 Iun 2010 03:54:22 +0000", "from_user": "mariacarol "," metadate ": " result_type ":" recent "," to_user_id ": null," text ":" RT @mobtuts: Cum se instalează Android 2.2 Froyo pe iPhone http://bit.ly/c8kBb6 ", "id": 15824617764, "from_user_id": 311442, "geo": null, "iso_language_code": "en", "sursă": "Seesmic",  "profile_image_url": "http://a1.twimg.com /profile_images/655595496/retro9_normal.gif","created_at":"Thu, 10 Iun 2010 03:52:28 +0000 "," from_user ":" cead22 "," metadate ": " result_type ":" recent " , "to_user_id": null, "text": "Quiero un # iPhone4 con #FroYo - Cum se instalează Android 2.2 Froyo pe iPhone http://bit.ly/c8kBb6 (@mobtuts)", "id": 15824510273, "from_user_id": 34036310, "geo": null, "iso_language_code": "en", "sursă": "Twitter pentru BlackBerry \ u00ae", "profile_image_url": "http://a1.twimg.com/profile_images /769690946/mobiletuts_icon_normal.png","created_at":"Thu, 10 Iun 2010 03:45:51 +0000 "," from_user ":" mobtuts ", metadate: "result_type": "recent", "to_user_id": null, "text": "Aboneaza-te acum la podcastul @mobtuts săptămânal! Alegeți RSS http://bit.ly/9LMbGX sau iTunes http://bit.ly/bq0QMC","id":15824135971,"from_user_id":104427899,"geo":null,"iso_language_code":"en ", "sursa": "HootSuite", "profile_image_url": "http://a1.twimg.com/profile_images/63581538/tutsplus_normal.jpg", "created_at": "Joi, 10 Iun 2010 03:25:00 + 0000 "," din_user ":" tutsplus "," metadate ": " result_type ":" recent "," to_user_id ": null," text ":" Înscrieți-vă acum la podcastul săptămânal @mobtuts! Alegeți RSS http://bit.ly/9LMbGX sau iTunes http://bit.ly/bq0QMC","id":15822900558,"from_user_id":2295627,"geo":null,"iso_language_code":"en ", "sursa": "TweetDeck", "profile_image_url": "http://a1.twimg.com/profile_images/234225566/illustration_normal.jpg", "created_at": "Joi, 10 Iun 2010 03:22:33 + 0000 "," din_user ":" GreatTwitTips "," metadate ": " result_type ":" recent "," to_user_id ": null," text ":" RT @mobtuts: RT @berryizm_feeds: MMMOOO o temă BlackBerry și un app dev comp ... http://bit.ly/agf0ND","id":15822755393,"from_user_id":19637346,"geo":null,"iso_language_code":"en","source ": "Twitterfeed" 

Putem vedea că căutăm cheile "profile_image_url", "from_user" și "text" pentru aplicația noastră.

Parserul

Să creați un simplu parser JSON și să faceți cererea de la API.

Twitter_SearchAppDelegate.h

 #import  @class Twitter_SearchViewController; @interface Twitter_SearchAppDelegate: NSObject  Fereastra UIWindow *; NSMutableData * responseData; Twitter_SearchViewController * viewController;  fereastra @property (nonatomic, reține) IBOutlet UIWindow *; @property (nonatomic, reține) IBOutlet Twitter_SearchViewController * viewController; @Sfârșit 

Acum vom adăuga cadrul JSON la declarațiile de import.

Twitter_SearchAppDelegate.m

 #import "JSON.h" 

De aici, vom modifica metoda didFinishLaunchingWithOptions în App Delegate și vom face un NSURLRequest pe Twitter cu URL-ul pentru a apuca Tweets pe care dorim să le procesăm. De asemenea, vom seta delegatul App să fie delegatul NSURLRequest.

 - (BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Punct de suprascriere pentru personalizare după lansarea aplicației. // Adăugați vizualizarea controlerului de vedere la fereastră și afișaj. responseData = [[NSMutableData data] păstrează]; tweets = [array NSMutableArray]; NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://search.twitter.com/search.json?q=mobtuts&rpp=5"]]; [[NSURLConnection alocare] initWithRequest: solicita delegat: auto]; reveniți DA;  

Acum, deoarece delegatul nostru din App este delegatul NSURLRequest, trebuie să implementăm aceste metode delegate. Suntem interesați în primul rând să fim anunțați când datele sunt trimise la noi și când cererea este completă și nu mai sunt date de primit.

 #pragma marca NSURLConnection Metode delegate - (void) conexiune: (NSURLConnection *) conexiune didReceiveResponse: (NSURLResponse *) răspuns [responseData setLength: 0];  - (void) conexiune: (NSURLConnection *) conexiune didReceiveData: (NSData *) date [replyData appendData: data];  - (void) conexiune: (NSURLConnection *) conexiune didFailWithError: (NSError *) eroare label.text = [NSString stringWithFormat: @ "Conectare eșuată:% @", [descriere eroare]];  

Acesta este locul în care parserul nostru face cea mai mare parte a activității. Este parsarea fișierului JSON și crearea unei serii de tweets pentru noi. Obținem matricea și o trimitem la TableViewController pentru ao afișa.

 - (void) connectionDidFinishLoading: (NSURLConnection *) conexiune [release release]; NSString * responseString = [[NSString alloc] initWithData: răspuns Codificare dată: NSUTF8StringEncoding]; [release release date]; NSDictionary * rezultate = [răspunsString JSONValue]; NSArray * allTweets = [rezultatele obiectuluiForKey: @ "rezultatele"]; [viewController setTweets: allTweets]; [fereastra addSubview: viewController.view]; [fereastra makeKeyAndVisible];  

O vizualizare simplă a tablei

Acum, pur și simplu folosim matricea pe care am creat-o de la parser pentru a afișa datele din TableView.

Twitter_SearchViewController.h

 #import  @interface Twitter_SearchViewController: UITableViewController NSArray * tweets; // aceasta este matricea care ne-a fost transmisă de la App Delegate @property (nonatomic, retain) NSArray * tweets; @Sfârșit 

TweetsTableViewController.m

În controler, trebuie mai întâi să sintetizăm proprietatea și apoi să setăm numărul de rânduri pe care le vom afișa

 @ tweeturi de sinteză; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) secțiunea // Returnați numărul de rânduri din secțiune. returnează numărul tweets;  

În cele din urmă, vom afișa tweets prin referirea la cheile lor specifice din dicționar. De la vizualizarea mai devreme a șirului JSON, știm că căutăm valorile asociate tastelor "from_user", "profile_image_url" și "text".

 // Personalizați aspectul celulelor de vizualizare a tabelului. - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath static NSString * CellIdentifier = @ "Celula"; UITableViewCell * celula = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; dacă (celula == zero) cell = [[[UITableViewCell alocare] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier] autorelease];  // Configurați celula ... NSDictionary * aTweet = [tweets objectAtIndex: [indexPath row]]; cell.textLabel.text = [aTweet objectForKey: @ "text"]; cell.textLabel.adjustsFontSizeToFitWidth = DA; cell.textLabel.font = [UIFont sistemFontOfSize: 12]; cell.textLabel.numberOfLines = 4; cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.detailTextLabel.text = [aTweet objectForKey: @ "from_user"]; NSURL * url = [NSURL URLWithString: [aTweet obiectForKey: @ "profile_image_url"]]; NSData * date = [NSData dataWithContentsOfURL: url]; cell.imageView.image = [UIImage imageWithData: date]; cell.selectionStyle = UITableViewCellSelectionStyleNone; celule retur;  

Considerații suplimentare

Dacă intenționați să utilizați fie trei, fie un httpriot, nu este nevoie să adăugați cadrul JSON. Acest proiect îl include deja în codul lor. Dacă intenționați să utilizați ASIHTTPRequest, cadrul JSON nu este inclus și trebuie să îl adăugați.

Cod