• 主页
  • 关于我
    • DSL'Blog photo

      DSL'Blog

      我叫董诗磊,我就是一码农.欢迎来到我的博客

    • 了解更多
    • Email
    • Github
  • 文章
    • 所有文章
    • 所有标签

Ios Json&xml

01 Apr 2017

Reading time ~1 minute

ß— layout: post title: “Json&Xml” date: 2017-04-01 10:59:21 +0700 categories: jekyll update —

Json&Xml


由于公司的项目不涉及大量的数据解析。所以解析数据的机会就越来越少,常说熟能生巧。我这都快生了。今天做个总结,也算是个复习吧!

首先说明本次的json解析不实用第三方。json解析的第三方有JsonKit,SBJosn,AFNetworking,YY系列等等有很多。根据个人的编码习惯,自己选择。我的习惯是不使用第三方。

不就是解析个数据嘛。

动动小手,啥都有。

废话不多说直接上代码。

json解析

解析json数据 用苹果官方给出的NSJSONSerialization(记得是iOS5的) 解析方式是性能最优越的,复杂程度还可以。

    NSURLSessionDataTask *tast = [[NSURLSession sharedSession]dataTaskWithURL:[NSURL URLWithString:@"https://api.douban.com/v2/movie/subject/25881786"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {



        //最外层是个字典直接用字典接收。如果是数组就用数组
        NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

         NSLog(@"=====%@",[dic objectForKey:@"alt"]);
         //成功输出=====https://movie.douban.com/subject/25881786/===具体的自己代码测试啊


    }];

    [tast resume];

生成json字符串

 NSDictionary * dic = @{
                           @"large":@"https://img3.doubanio.com/view/movie_poster_cover/lpst/public/p2276855500.jpg",
                           @"medium":@"https://img3.doubanio.com/view/movie_poster_cover/spst/public/p2276855500.jpg"
                           };

    NSData * data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];

    NSLog(@"===%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

xml解析

这个xml解析说实话。我都已经把他给忘了,因为从我工作第一天到现在没有遇见过xml解析。不知道现在还有没有公司在使用。不管有没有公司在使用,今天是做记录的,都要记录的。

首先对iOS的xml的概念做些了解,iOSxml解析主要有两种方式,SAX和DOM解析。SAX解析是标签读取,逐行解析数据,采用协议的方式获取数据。DOM解析就是把整个文档读入,将整个文档生成一个树结构,有节点,子节点等,然后对节点进行解析。

时间长啦。我都忘了。所以花了点时间准备一下,下面是demo

1.资源文件详见demo,或者找一些json文件直接转成xml。自行搜索。

2.demo

2.1

//首先建立一个model类

@interface DSLModel : NSObject

@property (nonatomic ,copy) NSString *proID;

@property (nonatomic ,copy) NSString *proName;

@property (nonatomic ,copy) NSString *pinyin;

@property (nonatomic ,copy) NSString *hits;

@end

2.2 Viewcontrol操作

- (void)xml{

    //声明一个数组,用来存放解析的数据
    self.dataArray = [[NSMutableArray alloc]init];

    NSString * path = [[NSBundle mainBundle]pathForResource:@"DSL.xml" ofType:nil];


    NSXMLParser * xmlParser = [[NSXMLParser alloc]initWithData:[NSData dataWithContentsOfFile:path]];

    xmlParser.delegate = self;

    [xmlParser parse];


}


#pragma mark NSXMLParserDelegate
//文档读区开始
- (void)parserDidStartDocument:(NSXMLParser *)parser
{

    NSLog(@"parse start");


}

//文档读取结束
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    NSLog(@"parser end ===%@",self.dataArray);

    [self.dataArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        DSLModel *model = (DSLModel*)obj;

        NSLog(@"====%@===%@==%@",model.proID,model.pinyin,model.proName);


    }];

}

//解析标签开始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{

    self.startTagFlag = elementName;

    if ([elementName isEqualToString:@"result"]) {

        self.model = [[DSLModel alloc]init];

        [self.dataArray addObject:self.model];

    }



}

//获取标签的内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

    if ([self.startTagFlag isEqualToString:@"proID"]) {

        [self.model setProID:string];
    }

    if ([self.startTagFlag isEqualToString:@"proName"]) {

        [self.model setProName:string];

    }


    if ([self.startTagFlag isEqualToString:@"pinyin"]) {

        [self.model setPinyin:string];
    }

}

//解析标签结束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

    self.startTagFlag = nil;


}

相关demo

没有啦,完啦。