iOS開發-JSON解析

weixin_33831673發表於2015-03-03

JSON(JavaScript Object Notation)在網路傳輸中幾乎無處不在,JSON是一種輕量級的資料交換格式,是基於JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集。 JSON採用完全獨立於語言的文字格式,資料格式容易閱讀和編寫,同時也非常便於機器解析和生成,在網路傳輸速度相對於傳統的XML快。JSON的英文官網http://www.json.org/,具體的格式可看官網,如果你是在看不懂,可以參考本文之前在Android中解析JSON的文章,其中還有關於JSON和XML的對比(Android資料解析-JSON解析)。

 JSON資料

一個最簡單的JSON資料如下{"Name":"FlyElephant"},Name是鍵,FlyElephant是值,用{}包裹;開發的時候經常會遇到客戶端與服務端打交道,資料傳輸基本上都是JSON格式,一般都是服務端提供介面資料,那麼我開始的時候沒有資料怎麼辦呢,自己單獨搞一個JSON字串自己解析也可以,不過沒什麼意思,不過還好國家氣象局提供的有介面資料,網上有些早的文章寫了多個介面,個人測試只有一個介面還是可以用的。http://m.weather.com.cn/data/101180601.html,這個連結老家的天氣介面,如果你想知道你老家的天氣介面,把html前面的數字編碼替換即可,如果想看帝都的天氣,連結地址如下:http://m.weather.com.cn/data/101010100.html,下面提供了一份全國的城市編碼,方便大家測試:

直轄市
    "北京","上海","天津","重慶"
    "101010100","101020100","101030100","101040100"

特別行政區
    "香港","澳門"
    "101320101","101330101"

黑龍江
    "哈爾濱","齊齊哈爾","牡丹江","大慶","伊春","雙鴨山","鶴崗","雞西","佳木斯","七臺河","黑河","綏化","大興安嶺"
    "101050101","101050201","101050301","101050901","101050801","101051301","101051201","101051101","101050401","101051002","101050601","101050501","101050701"
    
吉林
    "長春","延吉","吉林","白山","白城","四平","松原","遼源","大安","通化"
    "101060101","101060301","101060201","101060901","101060601","101060401","101060801","101060701","101060603","101060501"
    
遼寧
    "瀋陽","大連","葫蘆島","盤錦","本溪","撫順","鐵嶺","遼陽","營口","阜新","朝陽","錦州","丹東","鞍山"
    "101070101","101070201","101071401","101071301","101070501","101070401","101071101","101071001","101070801","101070901","101071201","101070701","101070601","101070301"
    
內蒙古
    "呼和浩特","呼倫貝爾","錫林浩特","包頭","赤峰","海拉爾","烏海","鄂爾多斯","通遼"
    "101080101","101081000","101080901","101080201","101080601","101081001","101080301","101080701","101080501"

河北
    "石家莊","唐山","張家口","廊坊","邢臺","邯鄲","滄州","衡水","承德","保定","秦皇島"
    "101090101","101090501","101090301","101090601","101090901","101091001","101090701","101090801","101090402","101090201","101091101"
    
河南
    "鄭州","開封","洛陽","平頂山","焦作","鶴壁","新鄉","安陽","濮陽","許昌","漯河","三門峽","南陽","商丘","信陽","周口","駐馬店"
    "101180101","101180801","101180901","101180501","101181101","101181201","101180301","101180201","101181301","101180401","101181501","101181701","101180701","101181001","101180601","101181401","101181601"
    
山東
    "濟南","青島","淄博","威海","曲阜","臨沂","煙臺","棗莊","聊城","濟寧","菏澤","泰安","日照","東營","德州","濱州","萊蕪","濰坊"
    "101120101","101120201","101120301","101121301","101120710","101120901","101120501","101121401","101121701","101120701","101121001","101120801","101121501","101121201","101120401","101121101","101121601","101120601"
    
山西
    "太原","陽泉","晉城","晉中","臨汾","運城","長治","朔州","忻州","大同","呂梁"
    "101100101","101100301","101100601","101100401","101100701","101100801","101100501","101100901","101101001","101100201","101101101"
    
江蘇
    "南京","蘇州","崑山","南通","太倉","吳縣","徐州","宜興","鎮江","淮安","常熟","鹽城","泰州","無錫","連雲港","揚州","常州","宿遷"
    "101190101","101190401","101190404","101190501","101190408","101190406","101190801","101190203","101190301","101190901","101190402","101190701","101191201","101190201","101191001","101190601","101191101","101191301"
    
安徽
    "合肥","巢湖","蚌埠","安慶","六安","滁州","馬鞍山","阜陽","宣城","銅陵","淮北","蕪湖","毫州","宿州","淮南","池州"
    "101220101","101221601","101220201","101220601","101221501","101221101","101220501","101220801","101221401","101221301","101221201","101220301","101220901","101220701","101220401","101221701"
    
陝西
    "西安","韓城","安康","漢中","寶雞","咸陽","榆林","渭南","商洛","銅川","延安"
    "101110101","101110510","101110701","101110801","101110901","101110200","101110401","101110501","101110601","101111001","101110300"
    
寧夏
    "銀川","固原","中衛","石嘴山","吳忠"
    "101170101","101170401","101170501","101170201","101170301"
    
甘肅
    "蘭州","白銀","慶陽","酒泉","天水","武威","張掖","甘南","臨夏","平涼","定西","金昌"
    "101160101","101161301","101160401","101160801","101160901","101160501","101160701","101050204","101161101","101160301","101160201","101160601"
    
青海
    "西寧","海北","海西","黃南","果洛","玉樹","海東","海南"
    "101150101","101150801","101150701","101150301","101150501","101150601","101150201","101150401"
    
湖北
    "武漢","宜昌","黃岡","恩施","荊州","神農架","十堰","咸寧","襄陽","孝感","隨州","黃石","荊門","鄂州"
"101200101","101200901","101200501","101201001","101200801","101201201","101201101","101200701","101200201","101200401","101201301","101200601","101201401","101200301"
    
湖南
    "長沙","邵陽","常德","郴州","吉首","株洲","婁底","湘潭","益陽","永州","岳陽","衡陽","懷化","韶山","張家界"
    "101250101","101250901","101250601","101250501","101251501","101250301","101250801","101250201","101250701","101251401","101251001","101250401","101251201","101250202","101251101"
    
浙江
    "杭州","湖州","金華","寧波","麗水","紹興","衢州","嘉興","台州","舟山","溫州"
    "101210101","101210201","101210901","101210401","101210801","101210501","101211001","101210301","101210601","101211101","101210701"
    
江西
    "南昌","萍鄉","九江","上饒","撫州","吉安","鷹潭","宜春","新餘","景德鎮","贛州"
    "101240101","101240901","101240201","101240301","101240401","101240601","101241101","101240501","101241001","101240801","101240701"
    
福建
    "福州","廈門","龍巖","南平","寧德","莆田","泉州","三明","漳州"
    "101230101","101230201","101230701","101230901","101230301","101230401","101230501","101230801","101230601"
    
貴州
    "貴陽","安順","赤水","遵義","銅仁","六盤水","畢節","凱里","都勻"
    "101260101","101260301","101260208","101260201","101260601","101260801","101260701","101260501","101260401"
    
四川
    "成都","瀘州","內江","涼山","阿壩","巴中","廣元","樂山","綿陽","德陽","攀枝花","雅安","宜賓","自貢","甘孜州","達州","資陽","廣安","遂寧","眉山","南充"
    "101270101","101271001","101271201","101271601","101271901","101270901","101272101","101271401","101270401","101272001","101270201","101271701","101271101","101270301","101271801","101270601","101271301","101270801","101270701","101271501","101270501"
    
廣東
    "廣州","深圳","潮州","韶關","湛江","惠州","清遠","東莞","江門","茂名","肇慶","汕尾","河源","揭陽","梅州","中山","德慶","陽江","雲浮","珠海","汕頭","佛山"
    "101280101","101280601","101281501","101280201","101281001","101280301","101281301","101281601","101281101","101282001","101280901","101282101","101281201","101281901","101280401","101281701","101280905","101281801","101281401","101280701","101280501","101280800"
    
廣西
    "南寧","桂林","陽朔","柳州","梧州","玉林","桂平","賀州","欽州","貴港","防城港","百色","北海","河池","來賓","崇左"
    "101300101","101300501","101300510","101300301","101300601","101300901","101300802","101300701","101301101","101300801","101301401","101301001","101301301","101301201","101300401","101300201"
    
雲南
    "昆明","保山","楚雄","德巨集","紅河","臨滄","怒江","曲靖","思茅","文山","玉溪","昭通","麗江","大理"
    "101290101","101290501","101290801","101291501","101290301","101291101","101291201","101290401","101290901","101290601","101290701","101291001","101291401","101290201"
    
海南
    "海口","三亞","儋州","瓊山","通什","文昌"
    "101310101","101310201","101310205","101310102","101310222","101310212"
    
新疆
    "烏魯木齊","阿勒泰","阿克蘇","昌吉","哈密","和田","喀什","克拉瑪依","石河子","塔城","庫爾勒","吐魯番","伊寧"
    "101130101","101131401","101130801","101130401","101131201","101131301","101130901","101130201","101130301","101131101","101130601","101130501","101131001"
    
西藏
    "拉薩","阿里","昌都","那曲","日喀則","山南","林芝"
    "101140101","101140701","101140501","101140601","101140201","101140301","101140401"
    
臺灣
    "臺北","高雄"
    "101340102","101340201"

天氣返回的資料就是JSON格式,不需要自己提供資料,圖片如下:

  

JSON解析

解析JSON一般有四種方式TouchJson、 SBJson 、JSONKit 和NSJSONSerialization,效能和速度的NSJSONSerialization>JSONKit>SBJSON>TouchJson,NSJSONSerialization是iOS5之後系統提供的,其他的為第三方類庫,現在手機基本上都是iOS6以上,本文就從系統自帶的NSJSONSerialization來解析JSON資料。

NSJSONSerialization有兩個方法:

dataWithJSONObject:從OC物件轉換成JSON資料

JSONObjectWithData:從JSON轉成OC物件

/* Generate JSON data from a Foundation object. If the object will not produce valid JSON then an exception will be thrown. Setting the NSJSONWritingPrettyPrinted option will generate JSON with whitespace designed to make the output more readable. If that option is not set, the most compact possible JSON will be generated. If an error occurs, the error parameter will be set and the return value will be nil. The resulting data is a encoded in UTF-8.
 */
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

/* Create a Foundation object from JSON data. Set the NSJSONReadingAllowFragments option if the parser should allow top-level objects that are not an NSArray or NSDictionary. Setting the NSJSONReadingMutableContainers option will make the parser generate mutable NSArrays and NSDictionaries. Setting the NSJSONReadingMutableLeaves option will make the parser generate mutable NSString objects. If an error occurs during the parse, then the error parameter will be set and the result will be nil.
   The data must be in one of the 5 supported encodings listed in the JSON specification: UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE. The data may or may not have a BOM. The most efficient encoding to use for parsing is UTF-8, so if you have a choice in encoding the data passed to this method, use UTF-8.
 */
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

故事板中放置一個UITextView:

@property (weak, nonatomic) IBOutlet UITextView *myTextView;

viewDidLoad中程式碼: 

    //設定URL
    NSURL *url=[NSURL URLWithString:@"http://m.weather.com.cn/data/101180601.html"];
    //設定請求
    NSURLRequest *request=[NSURLRequest requestWithURL:url];
    //接收資料
    NSData *responseData=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    //解析資料
    NSDictionary *weatherDic = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:nil];
    //展示結果
    NSDictionary *weatherResult= [weatherDic objectForKey:@"weatherinfo"];
   self.myTextView.text= [NSString stringWithFormat:@"今天是 %@  %@  %@  的天氣狀況:溫度%@  %@  %@---FlyElephant:http://www.cnblogs.com/xiaofeixiang",[weatherResult objectForKey:@"date_y"],[weatherResult objectForKey:@"week"],[weatherResult objectForKey:@"city"], [weatherResult objectForKey:@"temp1"],[weatherResult objectForKey:@"weather1"],[weatherResult objectForKey:@"index_ls"]];

跟之前的網路請求一樣,程式碼中有解析,如果不明白可以參考之前文章,最終演示效果如下:

相關文章