iOS-JSON&XML的解析

JSON数据(NSData) -> OC对象(Foundation Object)

  • JSON和OC对象转换后对应数据类型
    • {} -> NSDictionary @{}
    • [] -> NSArray @[]
    • "jack" -> NSString @"jack"
    • 10 -> NSNumber @10
    • 10.5 -> NSNumber @10.5
    • true -> NSNumber @1
    • false -> NSNumber @0
    • null -> NSNull
  • 转换方法
// 利用NSJSONSerialization类
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

// 示例:
NSDictionary *dict = @{
                           @"name":@"lnj",
                           @"age":@10,
                           @"gender":@"man"
                           };
    /*
     第一个参数: 需要转换为JSON的对象
     第二个参数: 转换为JSON之后是否需要排版
     第三个参数: 错误信息
     */
    NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
    NSString *temp = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", temp);


OC对象(Foundation Object)-> JSON数据(NSData)

  • 转换方法
// 利用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) {
        /*
         第一个参数: 需要转换的json数据
         第二个参数: 告诉系统如何转换json数据
         第三个参数: 错误信息
         */
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
}];
  • NSJSONReadingOptions
    • NSJSONReadingMutableContainers = (1UL << 0)
      • 创建出来的数组和字典就是可变
    • NSJSONReadingMutableLeaves = (1UL << 1)
      • 数组或者字典里面的字符串是可变的, iOS7以后无效
    • NSJSONReadingAllowFragments
      • 允许解析出来的对象不是字典或者数组,比如直接是字符串或者NSNumber(如果服务器返回的JSON数据, 不是标准的JSON, 那么就必须使用这个值, 否则无法解析)


XML的解析

XML的解析方式有2种:

  • DOM: 一次性将整个XML文档加载进内存,比较适合解析文件
  • SAX:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析文件

我们可以使用以下方法来解析

  • iOS原生: NSXMLParser:SAX方式解析,使用简单
  • 第三方 : libxml2,纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析

选择建议
大文件:NSXMLParser、libxml2
小文件:GDataXML、NSXMLParser、libxml2

NSXMLParser的用法

  • 创建解析器来解析
// 创建XML解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

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

// 开始解析XML(parse方法是阻塞式的)
[parser parse];
  • 代理对象要遵守NSXMLParserDelegate协议,实现代理方法
/**
 * 解析到某个元素的结尾(比如解析)
 */
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

}

/**
 * 解析到某个元素的开头(比如解析)
 */
- (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的用法

  • 配置
iOS-JSON&XML的解析_第1张图片

iOS-JSON&XML的解析_第2张图片
  • 设置非ARC标记


    iOS-JSON&XML的解析_第3张图片
  • 具体用法

// 加载整个文档
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:data options:0 error:nil];

// 获得根节点
doc.rootElement;

// 获得其他节点
[element elementsForName:@"video"];

// 获得节点的属性
[element attributeForName:@"name"].stringValue;

你可能感兴趣的:(iOS-JSON&XML的解析)