IOS中Json解析的四種方法

發(fā)現(xiàn)自己有很多文檔,所以現(xiàn)在整理一下税弃,以防忘了纪岁。。则果。

作為一種輕量級(jí)的數(shù)據(jù)交換格式幔翰,json正在逐步取代xml,成為網(wǎng)絡(luò)數(shù)據(jù)的通用格式西壮。

有的json代碼格式比較混亂遗增,可以使用此“http://www.bejson.com/”網(wǎng)站來(lái)進(jìn)行JSON格式化校驗(yàn)(點(diǎn)擊打開鏈接)。此網(wǎng)站不僅可以檢測(cè)Json代碼中的錯(cuò)誤款青,而且可以以視圖形式顯示json中的數(shù)據(jù)內(nèi)容做修,很是方便。

從IOS5開始可都,APPLE提供了對(duì)json的原生支持(NSJSONSerialization)缓待,但是為了兼容以前的ios版本,可以使用第三方庫(kù)來(lái)解析Json渠牲。

本文將介紹TouchJson旋炒、SBJson、JSONKit和iOS5所支持的原生的json方法签杈,解析國(guó)家氣象局API瘫镇,TouchJson和SBJson需要下載他們的庫(kù)

TouchJson包下載:http://download.csdn.net/detail/enuola/4523169

SBJson包下載:http://download.csdn.net/detail/enuola/4523177

JSONKit包下載:http://download.csdn.net/detail/enuola/4523160

下面的完整程序源碼包下載:http://download.csdn.net/detail/enuola/4523223

PS:

國(guó)家氣象局提供的天氣預(yù)報(bào)接口

接口地址有三個(gè):

http://www.weather.com.cn/data/sk/101010100.html

http://www.weather.com.cn/data/cityinfo/101010100.html

http://m.weather.com.cn/data/101010100.html

第三接口信息較為詳細(xì),提供的是6天的天氣鼎兽,關(guān)于API所返回的信息請(qǐng)見(jiàn)開源免費(fèi)天氣預(yù)報(bào)接口API以及全國(guó)所有地區(qū)代碼!O吵(國(guó)家氣象局提供)谚咬,全國(guó)各城市對(duì)應(yīng)這一個(gè)id號(hào),根據(jù)改變id好我們就可以解析出來(lái)各個(gè)城市對(duì)應(yīng)天氣尚粘;

下面介紹四種方法解析JSON:

首先建立一個(gè)新的工程择卦,(注意不要選擇ARC機(jī)制)添加如下控件:

如上圖所示。下面展出程序代碼:

文件ViewController.h中:

#import

@interface ViewController :UIViewController

@property (retain,nonatomic) IBOutlet UITextView *txtView;

- (IBAction)btnPressTouchJson:(id)sender;

-(IBAction)btnPressSBJson:(id)sender;

-(IBAction)btnPressIOS5Json:(id)sender;

-(IBAction)btnPressJsonKit:(id)sender;

@end

文件ViewController.m中主要代碼:

(1)使用TouchJSon解析方法:(需導(dǎo)入包:#import "TouchJson/JSON/CJSONDeserializer.h")

//使用TouchJson來(lái)解析北京的天氣

-(IBAction)btnPressTouchJson:(id)sender {

//獲取API接口

NSURL *url = [NSURLURLWithString:@"http://m.weather.com.cn/data/101010100.html"];

//定義一個(gè)NSError對(duì)象郎嫁,用于捕獲錯(cuò)誤信息

NSError *error;

NSString *jsonString = [NSStringstringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

NSLog(@"jsonString--->%@",jsonString);

//將解析得到的內(nèi)容存放字典中秉继,編碼格式為UTF8,防止取值的時(shí)候發(fā)生亂碼

NSDictionary *rootDic = [[CJSONDeserializerdeserializer] deserialize:[jsonString dataUsingEncoding:NSUTF8StringEncoding]error:&error];

//因?yàn)榉祷氐腏son文件有兩層泽铛,去第二層內(nèi)容放到字典中去

NSDictionary *weatherInfo = [rootDicobjectForKey:@"weatherinfo"];

NSLog(@"weatherInfo--->%@",weatherInfo);

//取值打印

txtView.text = [NSStringstringWithFormat:@"今天是%@%@%@的天氣狀況是:%@%@",[weatherInfo objectForKey:@"date_y"],[weatherInfoobjectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]];

}

(2)使用SBJson解析方法:(需導(dǎo)入包:#import "SBJson/SBJson.h")

//使用SBJson解析南陽(yáng)的天氣

-(IBAction)btnPressSBJson:(id)sender {

NSURL *url = [NSURLURLWithString:@"http://m.weather.com.cn/data/101180701.html"];

NSError *error = nil;

NSString *jsonString = [NSStringstringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

SBJsonParser *parser = [[SBJsonParseralloc] init];

NSDictionary *rootDic = [parserobjectWithString:jsonString error:&error];

NSDictionary *weatherInfo = [rootDicobjectForKey:@"weatherinfo"];

txtView.text = [NSStringstringWithFormat:@"今天是%@%@%@的天氣狀況是:%@%@",[weatherInfo objectForKey:@"date_y"],[weatherInfoobjectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]];

}

(3)使用IOS5自帶解析類NSJSONSerialization方法解析:(無(wú)需導(dǎo)入包尚辑,IOS5支持,低版本IOS不支持)

-(IBAction)btnPressIOS5Json:(id)sender {

NSError *error;

//加載一個(gè)NSURL對(duì)象

NSURLRequest *request = [NSURLRequestrequestWithURL:[NSURL URLWithString:@"http://m.weather.com.cn/data/101180601.html"]];

//將請(qǐng)求的url數(shù)據(jù)放到NSData對(duì)象中

NSData *response = [NSURLConnectionsendSynchronousRequest:request returningResponse:nil error:nil];

//IOS5自帶解析類NSJSONSerialization從response中解析出數(shù)據(jù)放到字典中

NSDictionary *weatherDic =[NSJSONSerialization JSONObjectWithData:responseoptions:NSJSONReadingMutableLeaves error:&error];

NSDictionary *weatherInfo = [weatherDicobjectForKey:@"weatherinfo"];

txtView.text = [NSStringstringWithFormat:@"今天是%@%@%@的天氣狀況是:%@%@",[weatherInfo objectForKey:@"date_y"],[weatherInfoobjectForKey:@"week"],[weatherInfo objectForKey:@"city"],[weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]];

NSLog(@"weatherInfo字典里面的內(nèi)容為--》%@",weatherDic );

}

(4)使用JSONKit的解析方法:(需導(dǎo)入包:#import "JSONKit/JSONKit.h")

-(IBAction)btnPressJsonKit:(id)sender {

//如果json是“單層”的盔腔,即value都是字符串杠茬、數(shù)字铝耻,可以使用objectFromJSONString

NSString *json1 =@"{\"a\":123, \"b\":\"abc\"}";

NSLog(@"json1:%@",json1);

NSDictionary *data1 = [json1objectFromJSONString];

NSLog(@"json1.a:%@",[data1objectForKey:@"a"]);

NSLog(@"json1.b:%@",[data1objectForKey:@"b"]);

[json1 release];

//如果json有嵌套琼腔,即value里有array啥刻、object巍沙,如果再使用objectFromJSONString,程序可能會(huì)報(bào)錯(cuò)(測(cè)試結(jié)果表明:使用由網(wǎng)絡(luò)或得到的php/json_encode生成的json時(shí)會(huì)報(bào)錯(cuò)贵涵,但使用NSString定義的json字符串時(shí),解析成功),最好使用objectFromJSONStringWithParseOptions:

NSString *json2 =@"{\"a\":123, \"b\":\"abc\",\"c\":[456, \"hello\"],\"d\":{\"name\":\"張三\",\"age\":\"32\"}}";

NSLog(@"json2:%@", json2);

NSDictionary *data2 = [json2objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];

NSLog(@"json2.c:%@", [data2objectForKey:@"c"]);

NSLog(@"json2.d:%@", [data2objectForKey:@"d"]);

[json2 release];

}

另外盐杂,由于iOS5新增了JSON解析的API,我們將其和其他五個(gè)開源的JSON解析庫(kù)進(jìn)行了解析速度的測(cè)試哆窿,下面是測(cè)試的結(jié)果链烈。

我們選擇的測(cè)試對(duì)象包含下面的這幾個(gè)框架,其中NSJSONSerialization是iOS5系統(tǒng)新增的JSON解析的API挚躯,需要iOS5的環(huán)境强衡,如果您在更低的版本進(jìn)行測(cè)試,應(yīng)該屏蔽相應(yīng)的代碼調(diào)用码荔。

- [SBJSON(json-framework)](http://code.google.com/p/json-framework/)

- [TouchJSON (from touchcode)](http://code.google.com/p/touchcode/)

- [YAJL (objective-Cbindings)](http://github.com/gabriel/yajl-objc)

- [JSONKit](https://github.com/johnezang/JSONKit)

- [NextiveJson](https://github.com/nextive/NextiveJson)

-[NSJSONSerialization](http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40010946)

我們選擇了四個(gè)包含json格式的數(shù)據(jù)的文件進(jìn)行測(cè)試漩勤。每一個(gè)文件進(jìn)行100的解析動(dòng)作,對(duì)解析的時(shí)間進(jìn)行比較缩搅。

.....

測(cè)試的結(jié)果顯示越败,系統(tǒng)的API的解析速度最快,我們?cè)诠こ添?xiàng)目中選擇使用硼瓣,也是應(yīng)用較為廣泛的SBJSON的解析速度為倒數(shù)第二差究飞,令我大跌眼鏡。

與系統(tǒng)API較為接近的應(yīng)該是JSONKit。

這里沒(méi)有對(duì)API的開放接口和使用方式進(jìn)行比較亿傅,若單純基于以上解析速度的測(cè)試:

1:iOS5應(yīng)該選擇系統(tǒng)的API進(jìn)行

2:不能使用系統(tǒng)API的應(yīng)該選擇JSONKit

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末媒峡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子葵擎,更是在濱河造成了極大的恐慌谅阿,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酬滤,死亡現(xiàn)場(chǎng)離奇詭異奔穿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)敏晤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門贱田,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人嘴脾,你說(shuō)我怎么就攤上這事男摧。” “怎么了译打?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵耗拓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我奏司,道長(zhǎng)乔询,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任韵洋,我火速辦了婚禮竿刁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搪缨。我一直安慰自己食拜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布副编。 她就那樣靜靜地躺著负甸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痹届。 梳的紋絲不亂的頭發(fā)上呻待,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音队腐,去河邊找鬼蚕捉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛香到,可吹牛的內(nèi)容都是我干的鱼冀。 我是一名探鬼主播报破,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼千绪!你這毒婦竟也來(lái)了充易?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荸型,失蹤者是張志新(化名)和其女友劉穎盹靴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瑞妇,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稿静,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辕狰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片改备。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔓倍,靈堂內(nèi)的尸體忽然破棺而出悬钳,到底是詐尸還是另有隱情,我是刑警寧澤偶翅,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布默勾,位于F島的核電站,受9級(jí)特大地震影響聚谁,放射性物質(zhì)發(fā)生泄漏母剥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一形导、第九天 我趴在偏房一處隱蔽的房頂上張望环疼。 院中可真熱鬧,春花似錦骤宣、人聲如沸秦爆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至爸吮,卻和暖如春芬膝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背形娇。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工锰霜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桐早。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓癣缅,卻偏偏與公主長(zhǎng)得像厨剪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子友存,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容