iPhone SDK Första steget med JSON-data med hjälp av Twitter API

Webb-tillgängliga API-skivor ger en mängd resurser för att utvidga funktionaliteten hos dina iPhone-appar. Dessa API: er tenderar att förbrukas i två primära dataformat: XML och JSON. IPhone SDK har inbyggt stöd för XML-parsning, och detta kommer att behandlas i en separat handledning. I denna handledning kommer vi att fokusera på att lägga till JSON-stöd till dina iOS-applikationer genom att visa hur du skapar en Twitter-läsprogram.

Introduktion

JSON Framework är en extremt populär ram. Den används för att driva en stor del av de vanliga apparna på App Store, inklusive Facebook-appen, Google Maps-appen och nästan alla Twitter-klienter där ute.

Varför JSON?

Det finns ett par skäl att välja JSON över XML. Den primära orsaken till att JSON föredras är att JSON-filer i allmänhet är mindre i filstorlek än deras XML-motsvarigheter, vilket naturligtvis resulterar i mindre belastningstid. En annan anledning att tänka på är att Apples Push Notification-system fungerar bäst med JSON nyttolast.

1. Komma igång

Skapa ett Xcode-projekt

  1. Skapa ett nytt Xcode-projekt av ditt val. Jag ska använda View-Based mallen.
  2. Ladda ner JSON Framework här.

Lägga till ramverket

Lägga till ramverket är enkelt. Du behöver bara dra filerna i ditt projekt. Det finns ett alternativ att länka biblioteket till ditt projekt, men det alternativet är nu avstängt och inte stöds.

  1. Dra JSON-mappen från DMG och släpp den i ditt Xcode-projekt. Du kan lägga till den i gruppen "Andra källor" om du vill.
  2. Välj alternativet "Kopiera objekt till destinationsgruppens mapp" när du blir ombedd.
  3. Lägg till:
     #import "JSON.h" 

    in i källfilerna där du ska använda ramverket.

2. Använda JSON-biblioteket

Ett exempel på JSON-meddelande

Följande är ett JSON-meddelande som representerar vad ett personobjekt kan se ut:

 "firstName": "John", "LastName": "Smith", "ålder": 25, "adress": "streetAddress": "21 2nd Street", "city": "New York" : "NY", "postkod": "10021", "telefonnummer": ["typ": "hem", "nummer": "212 555-1234", "typ": "fax" nummer ":" 646 555-4567 "] 

Analysera en JSON-sträng

För att analysera ovanstående laddar vi först JSON-meddelandet till en NSString:

 NSString * jsonString = [[NSString alloker] initWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @ "data" ofType: @ "json"] kodning: NSUTF8StringEncoding error: & error]; 

Från att titta på JSON-meddelandet kan vi se att data inkapslas med båda parenteserna (t.ex.. [] ) och fästen (t.ex.. ). Parenteserna är dataskalaer och fästena är dataspråkens ordböcker. Som du kan se kan vi näsa arrays av ordböcker, och ordlighetsobjekt kan innehålla arrays för flera värden.

I exemplet ovan har vi en ordlista för kontakt med nycklar som förnamn, efternamn, etc. Adressnyckeln pekar på en annan ordlista som innehåller egna nyckelvärdespar. Telefonnummersnyckeln i ordlistan innehåller en rad ordböcker.

För att analysera en matris som vi använder:

 NSArray * results = [jsonString JSONValue]; 

För att analysera en ordbok använder vi:

 NSDictionary * ordbok = [jsonString JSONValue]; NSArray * nycklar = [ordbok allKeys]; // nycklarna för din ordlista 

Välj den du behöver baserat på ditt rotobjekt. Om till exempel, om ditt API återkommer en lista med kontakter, skulle du få tillbaka en ordlista med kontakterordböcker. På samma sätt, om du ber om en twitter tidslinje, får du tillbaka en rad tweets där varje tweet är en ordlista.

Skapa en JSON-sträng

Att skapa en JSON-sträng är väldigt enkel och okomplicerad. Du skapar antingen ett NSDictionary med lämpliga nycklar och värden eller en NSArray med listan över objekt. Denna process liknar ganska hur vi analyserade JSON i föregående steg.

Du skulle skapa en ordbok med dina data.

 NSDictionary * contactData = [NSDictionary DictionaryWithObjectsAndKeys: _titleField.text, @ "title", _summaryField.text, @ "sammanfattning", _urlField.text, @ "url", _phoneField.text, @ "phone", _bdayField.text, @ " födelsedag ", _addrField.text, @" adress ", noll]; 

Lägg till din nyskapade datalogik i sin klass

 NSDictionary * finalData = [NSDictionary dictionaryWithObject: contactData forKey: @ "contact"]; 

Skapa sedan JSON-representationen i din klassordlista.

 NSString * newJSON = [finalData JSONRepresentation]; 

Du kan också skapa dina arrays och boarordlistor eller arrays i enlighet därmed.

Obs! Det finns ingen metod i JSON-ramverket som kommer att validera om ett meddelande är giltigt JSON.

3. Sätta allt ihop

Låt oss skapa en enkel iPhone-app som visar en lista över de senaste 5 tweetsna som innehåller mobtuts.

Vi ska använda Twitter Search API för enkelhet eftersom det inte kräver autentisering eller auktorisering.

En Tweet

Webbadressen för vår begäran är:

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

Detta kommer att returnera till oss ett ordboksresultat som innehåller en rad tweets.

För att göra livet lite enklare, låt oss koncentrera oss på bara användarens profilbildsadress, tweettexten och användarens twitter namn.

En enda resulterande tweet ser ut så här:

 "profile_image_url": "http://a3.twimg.com/profile_images/949941117/zucker_normal.jpg", "created_at": "tis 10 jun 2010 03:54:22 +0000", "from_user": "mariacarol "," metadata ": " result_type ":" recent "," to_user_id ": null," text ":" RT @mobtuts: Så här installerar du Android 2.2 Froyo på iPhone http://bit.ly/c8kBb6 " "id": 15824617764, "from_user_id": 311.442, "geo": null, "iso_language_code": "en", "källa": "Seesmic",  "profile_image_url": "http://a1.twimg.com /profile_images/655595496/retro9_normal.gif","created_at":"Thu, 10 Jun 2010 03:52:28 +0000 "," from_user ":" cead22 "," metadata ": " result_type ":" recent " , "to_user_id": null, "text": "Quiero un # iPhone4 con #FroYo - Så här installerar du Android 2.2 Froyo på iPhone http://bit.ly/c8kBb6 (@mobtuts)", "id": 15824510273, "from_user_id": 34036310, "geo": null, "iso_language_code": "en", "source": "Twitter for BlackBerry \ u00ae", "profile_image_url": "http://a1.twimg.com/profile_images /769690946/mobiletuts_icon_normal.png","created_at":"Thu, 10 Jun 2010 03:45:51 +0000 "," from_user ":" mobtuts "," mobtuts " "metadata": "result_type": "recent", "to_user_id": null, "text": "Prenumerera på @mobtuts vecka podcast nu! Välj RSS http://bit.ly/9LMbGX eller iTunes http://bit.ly/bq0QMC","id":15824135971,"from_user_id":104427899,"geo":null,"iso_language_code":"en ", "source": "HootSuite", "profile_image_url": "http://a1.twimg.com/profile_images/63581538/tutsplus_normal.jpg", "created_at": "tis 10 jun 2010 03:25:00 + 0000 "," from_user ":" tutsplus "," metadata ": " result_type ":" recent "," to_user_id ": null," text ":" Prenumerera på @mobtuts vecka podcast nu! Välj RSS http://bit.ly/9LMbGX eller iTunes http://bit.ly/bq0QMC","id":15822900558,"from_user_id":2295627,"geo":null,"iso_language_code":"en ", "source": "TweetDeck", "profile_image_url": "http://a1.twimg.com/profile_images/234225566/illustration_normal.jpg", "created_at": "tis 10 jun 2010 03:22:33 + 0000 "," from_user ":" GreatTwitTips "," metadata ": " result_type ":" recent "," to_user_id ": null," text ":" RT @mobtuts: RT @berryizm_feeds: 5 BlackBerry Theme Developer Tips från MMMOOO ett BlackBerry-tema och app dev comp ... http://bit.ly/agf0ND","id":15822755393,"from_user_id":19637346,"geo":null,"iso_language_code":"en","source ": "Twitter flöde" 

Vi kan se att vi letar efter "profile_image_url", "from_user" och "text" -nycklarna för vår app.

Parsern

Låt oss skapa en enkel JSON Parser och göra begäran från API: n.

Twitter_SearchAppDelegate.h

 #importera  @class Twitter_SearchViewController; @interface Twitter_SearchAppDelegate: NSObject  UIWindow * fönster; NSMutableData * responseData; Twitter_SearchViewController * viewController;  @property (nonatomic, behåll) IBOutlet UIWindow * -fönstret; @property (nonatomic, behåll) IBOutlet Twitter_SearchViewController * viewController; @slutet 

Nu lägger vi till JSON-ramen till importdeklarationerna.

Twitter_SearchAppDelegate.m

 #import "JSON.h" 

Härifrån ändrar vi didFinishLaunchingWithOptions-metoden i App Delegate och gör en NSURLRequest till Twitter med URL-adressen för att fånga tweetsna vi vill behandla. Vi ställer också in appdelegatet för att vara NSURLRequests delegat.

 - (BOOL) ansökan: (UIApplication *) ansökan didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Åsidosätt punkt för anpassning efter programstart. // Lägg till kontrollenhetens vy till fönstret och displayen. responseData = [[NSMutableData data] behåller]; tweets = [NSMutableArray array]; NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: @ "http://search.twitter.com/search.json?q=mobtuts&rpp=5"]]; [[NSURLConnection alloc] initWithRequest: begäran om delegat: själv]; returnera JA;  

Nu, eftersom vår appdelegator är NSURLRequests delegat, måste vi genomföra dessa delegerade metoder. Vi är främst intresserade av att bli underrättad när data skickas till oss och när förfrågan är klar och det finns inga fler data att ta emot.

 #pragma mark NSURLConnection Delegate methods - (void) anslutning: (NSURLConnection *) anslutning didReceiveResponse: (NSURLResponse *) svar [responseData setLength: 0];  - (tomt) anslutning: (NSURLConnection *) anslutning didReceiveData: (NSData *) data [responseData appendData: data];  - (tom) anslutning: (NSURLConnection *) anslutning didFailWithError: (NSError *) fel label.text = [NSString stringWithFormat: @ "Connection failed:% @", [felbeskrivning]];  

Det här är där vår parser gör det mesta av arbetet. Det parsar JSON-filen och skapar en uppsättning tweets för oss. Vi får matrisen och skickar den vidare till TableViewController för att visa den.

 - (void) connectionDidFinishLoading: (NSURLConnection *) anslutning [anslutningsversion]; NSString * responseString = [[NSString alloc] initWithData: responseData-kodning: NSUTF8StringEncoding]; [responseData release]; NSDictionary * results = [responseString JSONValue]; NSArray * allTweets = [results objectForKey: @ "results"]; [viewController setTweets: allTweets]; [fönster addSubview: viewController.view]; [fönster makeKeyAndVisible];  

En enkel tabellvy

Nu använder vi helt enkelt den matris som vi skapade från parsern för att visa data i vår TableView.

Twitter_SearchViewController.h

 #importera  @interface Twitter_SearchViewController: UITableViewController NSArray * tweets; // Detta är den matris som skickades till oss från App Delegate @property (nonatomic, retain) NSArray * tweets; @slutet 

TweetsTableViewController.m

I regulatorn måste vi först syntetisera egenskapen och sedan ange antalet rader som vi ska visa

 @synthesize tweets; - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) avsnittet // Återgå antalet rader i avsnittet. returnera [tweets count];  

Slutligen visar vi tweetsna genom att referera till deras specifika nycklar från ordlistan. Från att titta på JSON-strängen tidigare vet vi att vi letar efter de värden som är associerade med "from_user", "profile_image_url" och "text" -nycklarna.

 // Anpassa utseendet på tabellvynceller. - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath static NSString * CellIdentifier = @ "Cell"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; om (cell == nil) cell = [[[UITableViewCell-allokering] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier] autorelease];  // Konfigurera cellen ... NSDictionary * aTweet = [tweets objectAtIndex: [indexPath row]]; cell.textLabel.text = [aTweet objectForKey: @ "text"]; cell.textLabel.adjustsFontSizeToFitWidth = YES; cell.textLabel.font = [UIFont systemFontOfSize: 12]; cell.textLabel.numberOfLines = 4; cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.detailTextLabel.text = [aTweet objectForKey: @ "from_user"]; NSURL * url = [NSURL URLWithString: [aTweet objectForKey: @ "profile_image_url"]]; NSData * data = [NSData dataWithContentsOfURL: url]; cell.imageView.image = [UIImage imageWithData: data]; cell.selectionStyle = UITableViewCellSelectionStyleNone; returcell;  

Ytterligare överväganden

Om du planerar att använda antingen Three20 eller httpriot behöver du inte lägga till JSON-ramen. Dessa projekt innehåller redan det i sin kod. Om du planerar att använda ASIHTTPRequest är JSON-ramverket inte med och du behöver lägga till det själv.