简介Objective-C解析XML与JSON数据格式的方法
解析XML
本文以解析本地XML为例,网络获取到的返回值只需转换成NSData型,解析是同理
需要解析的xml文件如下,users.xml
<?xmlversion="1.0"encoding="UTF-8"?> <AllUsers> <message>用户信息</message> <user> <name>芳仔小脚印</name> <age>10</age> <school>JiangSuUniversity</school> </user> <user> <name>毒虫</name> <age>22</age> <school>NanJingUniversity</school> </user> <user> <name>女神</name> <age>23</age> <school>HongKongUniversity</school> </user> </AllUsers>
我们用一个数组来存放,最终数据结构为
( { message="用户信息"; }, { age=10; name="芳仔小脚印"; school="JiangSuUniversity"; }, { age=22; name="毒虫"; school="NanJingUniversity"; }, { age=23; name="女神"; school="HongKongUniversity"; } )
解析步骤
一、声明代理NSXMLParserDelegate
二、解析
//遇到节点message和user时作为一个字典存放 NSArray*keyElements=[[NSArrayalloc]initWithObjects:@"message",@"user",nil]; //需要解析的字段 NSArray*rootElements=[[NSArrayalloc]initWithObjects:@"message",@"name",@"age",@"school",nil]; //获取xml文件的路径 NSString*xmlPath=[[NSBundlemainBundle]pathForResource:@"users"ofType:@"xml"]; //转化为Data NSData*data=[[NSDataalloc]initWithContentsOfFile:xmlPath]; //初始化 NSXMLParser*xmlParser=[[NSXMLParseralloc]initWithData:data]; //代理 xmlParser.delegate=self; //开始解析 BOOLflag=[xmlParserparse]; if(flag){ NSLog(@"解析成功"); } else{ NSLog(@"解析出错"); }
中间变量,在.m的interface的中定义
NSString*currentElement; NSString*currentValue; NSMutableDictionary*rootDic; NSMutableArray*finalArray;
代理方法
#pragma-mark开始解析时 -(void)parserDidStartDocument:(NSXMLParser*)parser { //用数组存储每一组信息 finalArray=[[NSMutableArrayalloc]init]; } #pragma-mark发现节点时 -(void)parser:(NSXMLParser*)parserdidStartElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qNameattributes:(NSDictionary*)attributeDict { for(NSString*keyinself.keyElements){ if([elementNameisEqualToString:key]){ //关键节点开始时,初始化一个字典来存放值 rootDic=nil; rootDic=[[NSMutableDictionaryalloc]initWithCapacity:0]; } else{ for(NSString*elementinself.rootElements){ if([elementisEqualToString:element]){ currentElement=elementName; currentValue=[NSStringstring]; } } } } } #pragma-mark发现节点值时 -(void)parser:(NSXMLParser*)parserfoundCharacters:(NSString*)string { if(currentElement){ currentValue=string; [rootDicsetObject:stringforKey:currentElement]; } } #pragma-mark结束节点时 -(void)parser:(NSXMLParser*)parserdidEndElement:(NSString*)elementNamenamespaceURI:(NSString*)namespaceURIqualifiedName:(NSString*)qName { if(currentElement){ [rootDicsetObject:currentValueforKey:currentElement]; currentElement=nil; currentValue=nil; } for(NSString*keyinself.keyElements){ if([elementNameisEqualToString:key]){ //关键节点结束时,将字典存放在数组中 if(rootDic){ [finalArrayaddObject:rootDic]; } } } } #pragma-mark结束解析 -(void)parserDidEndDocument:(NSXMLParser*)parser { }
解析完成后,打印出finalArray为
( { message="\U7528\U6237\U4fe1\U606f"; }, { age=10; name="\U82b3\U4ed4\U5c0f\U811a\U5370"; school="JiangSuUniversity"; }, { age=22; name="\U6bd2\U866b"; school="NanJingUniversity"; }, { age=23; name="\U5973\U795e"; school="HongKongUniversity"; } )
使用SBJson拼接和解析json
1.ios解析json
使用开源json包,项目地址:
http://www.superloopy.io/json-framework/
NSData*responseData=[responesresponseData]; NSString*strResponser=[[NSStringalloc]initWithData:responseDataencoding:NSUTF8StringEncoding]; SBJsonParser*parser=[[SBJsonParseralloc]init]; NSMutableDictionary*dicMessageInfo=[parserobjectWithString:strResponser];//解析成json解析对象 [parserrelease]; //发送者 NSString*sender=[dicMessageInfoobjectForKey:@"sender"];
2.json嵌套对象解析:
//要上传的字符串 NSString*dataStr=[[NSStringalloc]initWithString:@"{\"cross\":{\"1\":\"true\",\"2\":\"false\",\"3\":\"true\"}}"]; //获取响应返回字符串 NSData*responseData=[responesresponseData]; NSString*strResponser=[[NSStringalloc]initWithData:responseDataencoding:NSUTF8StringEncoding]; //嵌套解析 SBJsonParser*parser=[[SBJsonParseralloc]init]; NSMutableDictionary*dicMessageInfo=[parserobjectWithString:strResponser];//解析成json解析对象 NSMutableDictionary*cross=[dicMessageInfoobjectForKey:@"cross"]; NSString*cross1=[crossobjectForKey:@"1"]; //解析json到各个字符串 //发送者 [parserrelease]; NSLog(@"cross1:%@",cross1);
3.拼接json字符串
通过使用SBJson中的SBJsonWriter类的方法-(NSString*)stringWithObject:(id)value可以将一个对象中的值格式化为json字符串,符合key/value格式的数据封装到NSDictionary后可以使用该方法进行格式化,其他数据通过拼接字符串的方式格式化。
在拼接过程中可以使用类NSMutableString的方法:
-(void)appendString:(NSString*)aString;、 -(void)appendFormat:(NSString*)format,...NS_FORMAT_FUNCTION(1,2);
动态添加字符串。
拼接的字符串可通过json在线验证的方式验证其格式是否正确,网址为:
http://jsonlint.com/
-(NSString*)getJsonString { NSMutableString*json=[NSMutableStringstringWithCapacity:128]; NSString*jsonString=nil; SBJsonWriter*writer=[[SBJsonWriteralloc]init]; [jsonappendString:@"{\"data\":{"]; [jsonappendFormat:@"\"%@\":\"%d\",",@"reset",reset]; if(missionStatus!=NULL) { jsonString=[writerstringWithObject:status]; if(jsonString!=NULL) { [jsonappendString:@"\"status\":"]; [jsonappendString:jsonString]; } } [jsonappendString:@"}}"]; returnjson; }
4.利用多个NSDictionary,拼接多层嵌套的json字符串,减少因手工拼接忘记加引号导致的json格式错误
示例代码:
NSDictionary*dataDictionary=[NSDictionarydictionaryWithObjectsAndKeys:mac,@"mac", game,@"game", devicetoken,@"devicetoken", device,@"device", gv,@"gv", lang,@"lang", os,@"os", hardware,@"hardware", down,@"down",nil]; NSDictionary*parmDictionary=[NSDictionarydictionaryWithObjectsAndKeys:@"getSession",@"act", dataDictionary,@"data",nil]; NSDictionary*jsonDictionary=[NSDictionarydictionaryWithObjectsAndKeys:pv,@"pv", parmDictionary,@"param",nil]; SBJsonWriter*writer=[[SBJsonWriteralloc]init]; NSString*jsonString=nil; jsonString=[writerstringWithObject:jsonDictionary]; NSLog(@"%@",jsonString);