iOS-JSON&XML的解析

JSON數(shù)據(jù)(NSData) -> OC對象(Foundation Object)

  • JSON和OC對象轉(zhuǎn)換后對應數(shù)據(jù)類型
    • {} -> NSDictionary @{}
    • [] -> NSArray @[]
    • "jack" -> NSString @"jack"
    • 10 -> NSNumber @10
    • 10.5 -> NSNumber @10.5
    • true -> NSNumber @1
    • false -> NSNumber @0
    • null -> NSNull
  • 轉(zhuǎn)換方法
// 利用NSJSONSerialization類
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

// 示例:
NSDictionary *dict = @{
                           @"name":@"lnj",
                           @"age":@10,
                           @"gender":@"man"
                           };
    /*
     第一個參數(shù): 需要轉(zhuǎn)換為JSON的對象
     第二個參數(shù): 轉(zhuǎn)換為JSON之后是否需要排版
     第三個參數(shù): 錯誤信息
     */
    NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
    NSString *temp = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", temp);

<br />

OC對象(Foundation Object)-> JSON數(shù)據(jù)(NSData)

  • 轉(zhuǎn)換方法
// 利用NSJSONSerialization類
+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

// 示例:
    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com/login?username=baidu&pwd=123&type=JSON"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        /*
         第一個參數(shù): 需要轉(zhuǎn)換的json數(shù)據(jù)
         第二個參數(shù): 告訴系統(tǒng)如何轉(zhuǎn)換json數(shù)據(jù)
         第三個參數(shù): 錯誤信息
         */
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
}];
  • NSJSONReadingOptions
    • NSJSONReadingMutableContainers = (1UL << 0)
      • 創(chuàng)建出來的數(shù)組和字典就是可變
    • NSJSONReadingMutableLeaves = (1UL << 1)
      • 數(shù)組或者字典里面的字符串是可變的, iOS7以后無效
    • NSJSONReadingAllowFragments
      • 允許解析出來的對象不是字典或者數(shù)組,比如直接是字符串或者NSNumber(如果服務器返回的JSON數(shù)據(jù), 不是標準的JSON, 那么就必須使用這個值, 否則無法解析)
        <br />

XML的解析

XML的解析方式有2種:

  • DOM: 一次性將整個XML文檔加載進內(nèi)存,比較適合解析文件
  • SAX:從根元素開始,按順序一個元素一個元素往下解析,比較適合解析文件

我們可以使用以下方法來解析

  • iOS原生: NSXMLParser:SAX方式解析,使用簡單
  • 第三方 : libxml2,純C語言,默認包含在iOS SDK中,同時支持DOM和SAX方式解析<br />

選擇建議
大文件:NSXMLParser、libxml2
小文件:GDataXML、NSXMLParser、libxml2

NSXMLParser的用法

  • 創(chuàng)建解析器來解析
// 創(chuàng)建XML解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

// 設置代理
parser.delegate = self;

// 開始解析XML(parse方法是阻塞式的)
[parser parse];
  • 代理對象要遵守NSXMLParserDelegate協(xié)議,實現(xiàn)代理方法
/**
 * 解析到某個元素的結尾(比如解析</videos>)
 */
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

}

/**
 * 解析到某個元素的開頭(比如解析<videos>)
 */
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{

}

/**
 * 開始解析XML文檔
 */
- (void)parserDidStartDocument:(NSXMLParser *)parser
{

}

/**
 * 解析完畢
 */
- (void)parserDidEndDocument:(NSXMLParser *)parser
{

}

GDataXML的用法

  • 配置

  • 設置非ARC標記


  • 具體用法

// 加載整個文檔
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

// 獲得根節(jié)點
doc.rootElement;

// 獲得其他節(jié)點
[element elementsForName:@"video"];

// 獲得節(jié)點的屬性
[element attributeForName:@"name"].stringValue;
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • JSON JSON和XML都是需要解析的 JSON是一種輕量級的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互服務器返回給客戶端的數(shù)據(jù)...
    JonesCxy閱讀 2,016評論 2 10
  • JSON JSON是一種輕量級的數(shù)據(jù)格式 一般用于數(shù)據(jù)交互 服務器返回給客戶端的數(shù)據(jù),一般都是JSON格式或者XM...
    RadioWaves閱讀 454評論 0 1
  • 本文主要介紹了XML和JSON數(shù)據(jù)解析的基本知識,并展示了NSXMLParser方法、GDataXML第三方庫以及...
    Rim99閱讀 2,565評論 1 21
  • 簡介 JSON是一種輕量級的數(shù)據(jù)格式,一般用于數(shù)據(jù)交互 服務器返回給客戶端的數(shù)據(jù),一般都是JSON格式或者XML格...
    SanMao_SFW閱讀 580評論 0 1
  • 解析的基本概念 解析: 從事先規(guī)定好的格式中提取數(shù)據(jù) 解析的前提: 提前約定好格式,數(shù)據(jù)提供方按照格式提供數(shù)據(jù),數(shù)...
    云之君兮鵬閱讀 1,941評論 4 28

友情鏈接更多精彩內(nèi)容