简介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);
|
|