当前位置: 首页 > 编程笔记 >

简介Objective-C解析XML与JSON数据格式的方法

羊舌琛
2023-03-14
本文向大家介绍简介Objective-C解析XML与JSON数据格式的方法,包括了简介Objective-C解析XML与JSON数据格式的方法的使用技巧和注意事项,需要的朋友参考一下

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

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

<?xml version="1.0" encoding="UTF-8"?>
<AllUsers>
 <message>用户信息</message>
 <user>
  <name>芳仔小脚印</name>
  <age>10</age>
  <school>JiangSu University</school>
 </user>
 <user>
  <name>毒虫</name>
  <age>22</age>
  <school>NanJing University</school>
 </user>
 <user>
  <name>女神</name>
  <age>23</age>
  <school>HongKong University</school>
 </user>
</AllUsers>

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

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

解析步骤

一、声明代理 NSXMLParserDelegate

二、解析


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

    NSArray *keyElements = [[NSArray alloc] initWithObjects:@"message",@"user", nil];

    // 需要解析的字段

    NSArray *rootElements = [[NSArray alloc] initWithObjects:@"message",@"name",@"age",@"school", nil];

    // 获取xml文件的路径

    NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"users" ofType:@"xml"];

    // 转化为Data

    NSData *data = [[NSData alloc] initWithContentsOfFile:xmlPath];

     

    // 初始化

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];

     

    // 代理

    xmlParser.delegate = self;

    // 开始解析

    BOOL flag = [xmlParser parse];

    if (flag) {

        NSLog(@"解析成功");

    }

    else{

        NSLog(@"解析出错");

    }


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

NSString *currentElement;

     

    NSString *currentValue;

     

    NSMutableDictionary *rootDic;

     

    NSMutableArray *finalArray;


代理方法

#pragma - mark 开始解析时

-(void)parserDidStartDocument:(NSXMLParser *)parser

{

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

    finalArray = [[NSMutableArray alloc] init];

     

     

}

#pragma - mark 发现节点时

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

{

    for(NSString *key in self.keyElements){

        if ([elementName isEqualToString:key]) {

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

            rootDic = nil;

             

            rootDic = [[NSMutableDictionary alloc] initWithCapacity:0];

             

        }

        else {

            for(NSString *element in self.rootElements){

                if ([element isEqualToString:element]) {

                    currentElement = elementName;

                    currentValue = [NSString string];

                }

            }

        }

    }

     

}

#pragma - mark 发现节点值时

 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{

     

    if (currentElement) {

 

        currentValue = string;

        [rootDic setObject:string forKey:currentElement];

    }

     

}

#pragma - mark 结束节点时

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

    if (currentElement) {

        [rootDic setObject:currentValue forKey:currentElement];

        currentElement = nil;

        currentValue = nil;

    }

    for(NSString *key in self.keyElements){

 

        if ([elementName isEqualToString:key]) {

            // 关键节点结束时,将字典存放在数组中

            if (rootDic) {

 

                [finalArray addObject:rootDic];

            }

        }

    }

}

#pragma - mark 结束解析

-(void)parserDidEndDocument:(NSXMLParser *)parser

{

     

}


解析完成后,打印出finalArray为

(
 {
  message = "\U7528\U6237\U4fe1\U606f";
 },
 {
  age = 10;
  name = "\U82b3\U4ed4\U5c0f\U811a\U5370";
  school = "JiangSu University";
 },
 {
  age = 22;
  name = "\U6bd2\U866b";
  school = "NanJing University";
 },
 {
  age = 23;
  name = "\U5973\U795e";
  school = "HongKong University";
 }
)

使用SBJson拼接和解析json
1.ios解析json
使用开源json包,项目地址:
http://www.superloopy.io/json-framework/


NSData * responseData = [respones responseData]; 

      

     NSString * strResponser = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

SBJsonParser * parser = [[SBJsonParser alloc]init]; 

     NSMutableDictionary *dicMessageInfo = [parser objectWithString:strResponser]; // 解析成json解析对象 

[parser release]; 

     //发送者 

     NSString * sender = [dicMessageInfo objectForKey:@"sender"]; 


2.json嵌套对象解析:

//要上传的字符串 

    NSString *dataStr=[[NSString alloc] initWithString:@"{\"cross\":{\"1\":\"true\",\"2\":\"false\",\"3\":\"true\"}}"]; 

//获取响应返回字符串 

NSData * responseData = [respones responseData]; 

        

        NSString * strResponser = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

//嵌套解析 

SBJsonParser * parser = [[SBJsonParser alloc]init]; 

            

            NSMutableDictionary *dicMessageInfo = [parser objectWithString:strResponser]; // 解析成json解析对象 

            

            NSMutableDictionary * cross = [dicMessageInfo objectForKey:@"cross"]; 

            

            NSString *cross1= [cross objectForKey:@"1"]; 

            //解析json到各个字符串 

            //发送者 

            [parser release]; 

            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 = [NSMutableString stringWithCapacity:128]; 

    NSString *jsonString=nil; 

    SBJsonWriter *writer = [[SBJsonWriter alloc] init]; 

    [json appendString:@"{\"data\":{"]; 

    [json appendFormat:@"\"%@\":\"%d\",",@"reset",reset]; 

    if(missionStatus!=NULL) 

    { 

        jsonString=[writer stringWithObject:status]; 

        if(jsonString!=NULL) 

        { 

            [json appendString:@"\"status\":"]; 

            [json appendString:jsonString]; 

        } 

    } 

    [json appendString:@"}}"]; 

    return json; 

} 


4.利用多个NSDictionary,拼接多层嵌套的json字符串,减少因手工拼接忘记加引号导致的json格式错误
示例代码:

NSDictionary *dataDictionary= [NSDictionary dictionaryWithObjectsAndKeys:mac,@"mac", 

                                   game,@"game", 

                                   devicetoken,@"devicetoken", 

                                   device,@"device", 

                                   gv,@"gv", 

                                   lang,@"lang", 

                                   os,@"os", 

                                   hardware,@"hardware", 

                                   down,@"down",nil]; 

    NSDictionary *parmDictionary= [NSDictionary dictionaryWithObjectsAndKeys:@"getSession",@"act", 

                                   dataDictionary,@"data",nil]; 

    NSDictionary *jsonDictionary=[NSDictionary dictionaryWithObjectsAndKeys:pv,@"pv", 

                                  parmDictionary,@"param",nil]; 

    SBJsonWriter *writer = [[SBJsonWriter alloc] init]; 

    

    NSString *jsonString=nil; 

    jsonString=[writer stringWithObject:jsonDictionary]; 

    NSLog(@"%@",jsonString); 


 类似资料:
  • 本文向大家介绍Java解析XML格式数据的方法详解,包括了Java解析XML格式数据的方法详解的使用技巧和注意事项,需要的朋友参考一下 最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩展,严格的语法规定,可使用有意义的标记,内容存储和表现分离等等优势注定了该语言从诞生之日起就会走向辉煌。 XML 语

  • 本文向大家介绍C#实现json格式数据解析功能的方法详解,包括了C#实现json格式数据解析功能的方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现json格式数据解析功能的方法。分享给大家供大家参考,具体如下: 来写写json的解析吧 首先添加web引用 System.Web.Extensions 路径 c:\Program Files (x86)\Reference As

  • 我试图解析通过api调用获取的xml数据。我可以使用file\u get\u内容来读取字符串,但simpleXML\u load\u字符串似乎无法读取它。我可以将它保存到一个文件中,然后simpleXML\u load\u文件工作。但我宁愿不把内容写入文件。我似乎也不明白如何使用DOM或XMLParse。我不熟悉PHP和解析XML。api调用的输出数据如下所示。 我发现问题在于我在浏览器中看到的实

  • Objective-C是通用语言,它是在C语言编程语言之上开发的,它增加了Small Talk编程语言的功能,使Objective-C成为面向对象的语言。 它主要用于开发iOS和Mac OS X操作系统及其应用程序。 最初,Objective-C是由NeXT为其NeXTSTEP操作系统开发的,之后苹果公司使用它来开发iOS和Mac OS X,并接管了Objective-C。 1. 面向对象的编程

  • 问题内容: 我已经完成了有关iOS中JSON的Raywenderlich教程,但是我很难将其调整为适合自己的JSON文件。这是 我的JSON : 这是 我的代码 : 日志返回。 问题答案: 你这样做是不对的。您已正确将JSON数据填充到字典(名为)中。但你有一个(被称为你的主要内部)和价值的是内部数组。 正确的代码是: 了解概念。这取决于你的内心里有什么。如果它是一个数组(在Values内部),则

  • 本文向大家介绍Objective-C语言XML解析,包括了Objective-C语言XML解析的使用技巧和注意事项,需要的朋友参考一下