JSON XML 数据解析

Posted LLLLLuke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSON XML 数据解析相关的知识,希望对你有一定的参考价值。

作为客户端,一般从后台传入的数据主要是两种 ,一种是JSON数据 一种是XML格式的数据  对于这两种数据  咱们都要一套自己的解析方法

JSON:

JSON(javascript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。 JSON 是出自于 JavaScript ,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的 Object 对象

常见的两种格式:

1. 这种对应着ios中的键值对
{
    "length" : "1",
    "url" : "http:\/\/127.0.0.1\/resources\/1",
    "image" : "http:\/\/127.0.0.1\/resources\/images\/_01.png",
    "ID" : "01",
    "name" : "第一"
},
{
    "length" : "2",
    "url" : "http:\/\/127.0.0.1\/resources\/2",
    "image" : "http:\/\/127.0.0.1\/resources\/images\/_02.png",
    "ID" : "02",
    "name" : "第2"
}


2.这种对应着数组
[
{
    "length" : "1",
    "url" : "http:\/\/127.0.0.1\/resources\/1",
    "image" : "http:\/\/127.0.0.1\/resources\/images\/_01.png",
    "ID" : "01",
    "name" : "第一"
},
{
    "length" : "2",
    "url" : "http:\/\/127.0.0.1\/resources\/2",
    "image" : "http:\/\/127.0.0.1\/resources\/images\/_02.png",
    "ID" : "02",
    "name" : "第2"
}
]

解析:

1把JSON数据转换到OC能识别的数据 序列化
  id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL] ;  

2.将OC数据转换成JSON数据  反序列化
 NSData *data =[NSJSONSerialization dataWithJSONObject:arrM options:0 error:NULL];

 

 

 

 

 

XML:

XML(Extensible Markup Language ),可扩展标记语言,是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立

常见的两种格式:

 

1.  只有元素 和属性 没有元素内容的
<?xml version="1.0" encoding="UTF-8"?>
<citys>
    <city ID = "01" name = "北京 " length = "2" image = "http://127.0.0.1/resources/images/01.png" url = "http://127.0.0.1/resources/videos/01.mp4" />
</citys>

2.元素 和元素内容  没有元素属性
<citys>
    <ciyt>
        <ID>01</ID>
        <image>http://127.0.0.1/resources/images/01.png</image>
        <length>2</length>
        <name>北京</name>
        <url>http://127.0.0.1/resources/videos/01.mp4</url>
    </city>
</citys>

 

解析:

上述第一种解析方式:(控制器中:)

  // 创建XML解析器
        NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
        
        // 设置代理  遵守协议
        
        parser.delegate = self;
        //开始解析/同步解析
        
        [parser parse];
     
// 实现代理方法
#pragma mark - XML解析器的代理方法
// 开始解析文档时去调用
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"开始解析文档");
}

// 开始解析元素的时候调用,attributes存储着元素的属性
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
    NSLog(@"开始解析元素%@,元素属性:%@",elementName,attributeDict);
    if ([elementName isEqualToString:@"city"]) {
        
        BFModel *model = [BFModel modelWithDict:attributeDict];
        [self.videosArrM addObject:model];
    }
}

// 发现元素内容的时候去调用
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    
    NSLog(@"元素内容:%@",string);
    
    
}

// 元素解析后调用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    NSLog(@"%@元素解析完成",elementName);
}

// 文档解析结束后调用
- (void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"文档解析完成");
}


*****************************************************************

上述第二种解析方式:

// 定义两个全局变量

@interface ViewController ()<NSXMLParserDelegate>

@property (nonatomic,strong)NSMutableArray *videosArrM;

@property (nonatomic,strong)BFModel *model;

// 对应的当前的字符串的内容
@property (nonatomic,strong)NSMutableString *curretStrM;

@end



 // 创建XML解析器
        NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
        
        // 设置代理  遵守协议
        
        parser.delegate = self;
        //开始解析/同步解析
        
        [parser parse];

// 开始解析文档时去调用
- (void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"开始解析文档");
}

// 开始解析元素的时候调用,attributes存储着元素的属性
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
    NSLog(@"开始解析元素%@,元素属性:%@",elementName,attributeDict);
    if ([elementName isEqualToString:@"city"]) {
        
        self.model = [[BFModel alloc]init];
        [self.videosArrM addObject:self.model];
    }
    
}

// 发现元素的时候去调用
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    
    NSLog(@"发现元素内容:%@",string);
    // 将字符串的内容替换
    [self.curretStrM setString:string];
}

// 元素解析后调用
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    NSLog(@"%@元素解析完成",elementName);
    if ([elementName isEqualToString:@"ID"]) {
        [self.model setValue:self.curretStrM forKey:elementName];
    }else if ([elementName isEqualToString:@"image"]){
        [self.model setValue:self.curretStrM forKey:elementName];
    }else if ([elementName isEqualToString:@"length"]){
        [self.model setValue:self.curretStrM forKey:elementName];
    }else if ([elementName isEqualToString:@"url"]){
        [self.model setValue:self.curretStrM forKey:elementName];
    }else if ([elementName isEqualToString:@"name"]){
        [self.model setValue:self.curretStrM forKey:elementName];
    }
}

// 文档解析结束后调用
- (void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"文档解析完成");
}

 

以上是关于JSON XML 数据解析的主要内容,如果未能解决你的问题,请参考以下文章

AJAX 响应:数据(JSON、XML)还是 HTML 片段? [关闭]

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

不要在片段中显示列表视图项

iOS开发——XML/JSON数据解析

解析 JSON 文件数据后,在结果 XML 中添加注释

如何从片段中的 JSON 响应中的对象获取数据