配色: 字号:
简介Objective-C解析XML与JSON数据格式的方法
2016-10-29 | 阅:  转:  |  分享 
  
简介Objective-C解析XML与JSON数据格式的方法

这篇文章主要介绍了Objective-C解析XML与JSON数据格式的方法,文中解析JSON包括拼接JSON字符串用到了SBJson这个解析器,需要的朋友可以参考下



解析XML

本文以解析本地XML为例,网络获取到的返回值只需转换成NSData型,解析是同理



需要解析的xml文件如下,users.xml



用户信息芳仔小脚印10JiangSuUniversity毒虫22NanJingUniversity女神23HongKongUniversity



我们用一个数组来存放,最终数据结构为



({message="用户信息";},{age=10;name="芳仔小脚印";school="JiangSuUniversity";},{age=22;name="毒虫";school="NanJingUniversity";},{age=23;name="女神";school="HongKongUniversity";})



解析步骤



一、声明代理NSXMLParserDelegate



二、解析





复制代码代码如下:





//遇到节点message和user时作为一个字典存放

NSArraykeyElements=[[NSArrayalloc]initWithObjects:@"message",@"user",nil];

//需要解析的字段

NSArrayrootElements=[[NSArrayalloc]initWithObjects:@"message",@"name",@"age",@"school",nil];

//获取xml文件的路径

NSStringxmlPath=[[NSBundlemainBundle]pathForResource:@"users"ofType:@"xml"];

//转化为Data

NSDatadata=[[NSDataalloc]initWithContentsOfFile:xmlPath];



//初始化

NSXMLParserxmlParser=[[NSXMLParseralloc]initWithData:data];



//代理

xmlParser.delegate=self;

//开始解析

BOOLflag=[xmlParserparse];

if(flag){

NSLog(@"解析成功");

}

else{

NSLog(@"解析出错");

}





中间变量,在.m的interface的中定义



复制代码代码如下:





NSStringcurrentElement;



NSStringcurrentValue;



NSMutableDictionaryrootDic;



NSMutableArrayfinalArray;





代理方法



复制代码代码如下:





#pragma-mark开始解析时

-(void)parserDidStartDocument:(NSXMLParser)parser

{

//用数组存储每一组信息

finalArray=[[NSMutableArrayalloc]init];





}

#pragma-mark发现节点时

-(void)parser:(NSXMLParser)parserdidStartElement:(NSString)elementNamenamespaceURI:(NSString)namespaceURIqualifiedName:(NSString)qNameattributes:(NSDictionary)attributeDict

{

for(NSStringkeyinself.keyElements){

if([elementNameisEqualToString:key]){

//关键节点开始时,初始化一个字典来存放值

rootDic=nil;



rootDic=[[NSMutableDictionaryalloc]initWithCapacity:0];



}

else{

for(NSStringelementinself.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(NSStringkeywww.visa158.cominself.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包,

复制代码代码如下:





NSDataresponseData=[responesresponseData];



NSStringstrResponser=[[NSStringalloc]initWithData:responseDataencoding:NSUTF8StringEncoding];

SBJsonParserparser=[[SBJsonParseralloc]init];

NSMutableDictionarydicMessageInfo=[parserobjectWithString:strResponser];//解析成json解析对象

[parserrelease];

//发送者

NSStringsender=[dicMessageInfoobjectForKey:@"sender"];





2.json嵌套对象解析:



复制代码代码如下:





//要上传的字符串

NSStringdataStr=[[NSStringalloc]initWithString:@"{\"cross\":{\"1\":\"true\",\"2\":\"false\",\"3\":\"true\"}}"];

//获取响应返回字符串

NSDataresponseData=[responesresponseData];



NSStringstrResponser=[[NSStringalloc]initWithData:responseDataencoding:NSUTF8StringEncoding];

//嵌套解析

SBJsonParserparser=[[SBJsonParseralloc]init];



NSMutableDictionarydicMessageInfo=[parserobjectWithString:www.hunanwang.netstrResponser];//解析成json解析对象



NSMutableDictionarycross=[dicMessageInfoobjectForKey:@"cross"];



NSStringcross1=[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在线验证的方式验证其格式是否正确



复制代码代码如下:





-(NSString)getJsonString

{

NSMutableStringjson=[NSMutableStringstringWithCapacity:128];

NSStringjsonString=nil;

SBJsonWriterwriter=[[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格式错误

示例代码:



复制代码代码如下:





NSDictionarydataDictionary=[NSDictionarydictionaryWithObjectsAndKeys:mac,@"mac",

game,@"game",

devicetoken,@"devicetoken",

device,@"device",

gv,@"gv",

lang,@"lang",

os,@"os",

hardware,@"hardware",

down,@"down",nil];

NSDictionaryparmDictionary=[NSDictionarydictionaryWithObjectsAndKeys:@"getSession",@"act",

dataDictionary,@"data",nil];

NSDictionaryjsonDictionary=[NSDictionarydictionaryWithObjectsAndKeys:pv,@"pv",

parmDictionary,@"param",nil];

SBJsonWriterwriter=[[SBJsonWriteralloc]init];



NSStringjsonString=nil;

jsonString=[writerstringWithObject:jsonDictionary];

NSLog(@"%@",jsonString);





















献花(0)
+1
(本文系白狐一梦首藏)