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