作为客户端,一般从后台传入的数据主要是两种 ,一种是JSON数据 一种是XML格式的数据 对于这两种数据 咱们都要一套自己的解析方法
JSON:
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。 JSON 是出自于 JavaScript ,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象
常见的两种格式:
1. 这种对应着iOS中的键值对 { "length" : "1", "url" : "http://127.0.0.1/resources/1", "image" : "http://127.0.0.1/resources/images/_01.png", "ID" : "01", "name" : "第一" }, { "length" : "2", "url" : "http://127.0.0.1/resources/2", "image" : "http://127.0.0.1/resources/images/_02.png", "ID" : "02", "name" : "第2" } 2.这种对应着数组 [ { "length" : "1", "url" : "http://127.0.0.1/resources/1", "image" : "http://127.0.0.1/resources/images/_01.png", "ID" : "01", "name" : "第一" }, { "length" : "2", "url" : "http://127.0.0.1/resources/2", "image" : "http://127.0.0.1/resources/images/_02.png", "ID" : "02", "name" : "第2" } ]
解析:
1把JSON数据转换到OC能识别的数据 序列化 id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL] ; 2.将OC数据转换成JSON数据 反序列化 NSData *data =[NSJSONSerialization dataWithJSONObject:arrM options:0 error:NULL];
XML:
XML(Extensible Markup Language ),可扩展标记语言,是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立
常见的两种格式:
1. 只有元素 和属性 没有元素内容的 <?xml version="1.0" encoding="UTF-8"?> <citys> <city ID = "01" name = "北京 " length = "2" image = "http://127.0.0.1/resources/images/01.png" url = "http://127.0.0.1/resources/videos/01.mp4" /> </citys> 2.元素 和元素内容 没有元素属性 <citys> <ciyt> <ID>01</ID> <image>http://127.0.0.1/resources/images/01.png</image> <length>2</length> <name>北京</name> <url>http://127.0.0.1/resources/videos/01.mp4</url> </city> </citys>
解析:
上述第一种解析方式:(控制器中:) // 创建XML解析器 NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data]; // 设置代理 遵守协议 parser.delegate = self; //开始解析/同步解析 [parser parse]; // 实现代理方法 #pragma mark - XML解析器的代理方法 // 开始解析文档时去调用 - (void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"开始解析文档"); } // 开始解析元素的时候调用,attributes存储着元素的属性 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{ NSLog(@"开始解析元素%@,元素属性:%@",elementName,attributeDict); if ([elementName isEqualToString:@"city"]) { BFModel *model = [BFModel modelWithDict:attributeDict]; [self.videosArrM addObject:model]; } } // 发现元素内容的时候去调用 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ NSLog(@"元素内容:%@",string); } // 元素解析后调用 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ NSLog(@"%@元素解析完成",elementName); } // 文档解析结束后调用 - (void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"文档解析完成"); } ***************************************************************** 上述第二种解析方式: // 定义两个全局变量 @interface ViewController ()<NSXMLParserDelegate> @property (nonatomic,strong)NSMutableArray *videosArrM; @property (nonatomic,strong)BFModel *model; // 对应的当前的字符串的内容 @property (nonatomic,strong)NSMutableString *curretStrM; @end // 创建XML解析器 NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data]; // 设置代理 遵守协议 parser.delegate = self; //开始解析/同步解析 [parser parse]; // 开始解析文档时去调用 - (void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"开始解析文档"); } // 开始解析元素的时候调用,attributes存储着元素的属性 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{ NSLog(@"开始解析元素%@,元素属性:%@",elementName,attributeDict); if ([elementName isEqualToString:@"city"]) { self.model = [[BFModel alloc]init]; [self.videosArrM addObject:self.model]; } } // 发现元素的时候去调用 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ NSLog(@"发现元素内容:%@",string); // 将字符串的内容替换 [self.curretStrM setString:string]; } // 元素解析后调用 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ NSLog(@"%@元素解析完成",elementName); if ([elementName isEqualToString:@"ID"]) { [self.model setValue:self.curretStrM forKey:elementName]; }else if ([elementName isEqualToString:@"image"]){ [self.model setValue:self.curretStrM forKey:elementName]; }else if ([elementName isEqualToString:@"length"]){ [self.model setValue:self.curretStrM forKey:elementName]; }else if ([elementName isEqualToString:@"url"]){ [self.model setValue:self.curretStrM forKey:elementName]; }else if ([elementName isEqualToString:@"name"]){ [self.model setValue:self.curretStrM forKey:elementName]; } } // 文档解析结束后调用 - (void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"文档解析完成"); }