JSON解析
什么是JSON
JSON是一种轻量级的数据格式,一般用于数据交互
服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
JSON的格式很像OC中的字典和数组
{"name" : "jack", "age" : 10}
{"names" : ["jack", "rose", "jim"]}
标准JSON格式的注意点:key必须用双引号
要想从JSON中挖掘出具体数据,得对JSON进行解析
JSON 转换为 OC数据类型
JSON – OC 转换对照表
JSON | OC |
---|---|
大括号 { } | NSDictionary |
中括号 [ ] | NSArray |
双引号 ” “ | NSString |
数字 10、10.8 | NSNumber |
JSON解析方案
在iOS中,JSON的常见解析方案有4种
第三方框架:JSONKit、SBJson、TouchJSON(性能从左到右,越差)
苹果原生(自带):NSJSONSerialization(性能最好)
NSJSONSerialization的常见方法 //JSON数据 到 OC对象 + (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error; //OC对象 到 JSON数据 + (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;
解析来自服务器的JSON
实例:解析一个BOOK.JSON
=================================================================
项目文件结构:
=============================================================================
// BOOK.h
#import <Foundation/Foundation.h>
@interface BOOK : NSObject
//创建相应的成员属性,封装对象
@property (copy) NSString * Id;
@property (copy) NSString * language;
@property (copy) NSString * name;
@property double price;
@property (copy) NSString * summary;
@property (copy) NSString * auther_name;
@end
==============================================================================
// BOOK.m
#import "BOOK.h"
@implementation BOOK
@end
===============================================================================
// Book_manager.h
#import <Foundation/Foundation.h>
#import "BOOK.h"
//下面这句话的作用是去除Nslog方法前面的调试信息,使输出结果更直观
#define NSLog(FORMAT, ...) \
printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__]UTF8String]);
@interface Book_manager : NSObject
@property (nonatomic) NSMutableArray * dict;
//封装一个书本管理类
- (id)init; //初始化方法
- (void)addBOOK:(BOOK *)book; //增加书本方法
- (void)showAllBook; //显示所有书本方法
@end
==============================================================================
// Book_manager.m
#import "Book_manager.h"
@implementation Book_manager
- (id)init
{
if(self = [super init]){
_dict = [NSMutableArray new];
}
return self;
}
- (void)addBOOK:(BOOK *)book{
[_dict addObject:book];
}
- (void)showAllBook
{
//从词典遍历所有书本信息并输出
for (BOOK *bb in _dict) {
NSLog(@"序列号:%@",[bb Id]);
NSLog(@"书名:%@",bb.name);
NSLog(@"语言:%@",bb.language);
NSLog(@"作者:%@",bb.auther_name);
NSLog(@"价格:%.2lf",bb.price);
NSLog(@"简介:%@",bb.summary);
NSLog(@"============================================");
}
}
@end
===============================================================================
// main.m
#import <Foundation/Foundation.h>
#import "BOOK.h"
#import "Book_manager.h"
#define path @"/Users/qf/Desktop/Json文件/Book.json"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//实例化一个书本管理类
Book_manager *bm = [Book_manager new];
//读入文件
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
//NSLog(@"%@",content); //这句话可以用来测试是否读取到数据
//转换成二进制数据
NSData * data = [content dataUsingEncoding:NSUTF8StringEncoding];
//解析JSON文件 OC中自带的方法
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
//过滤节点,如果是{}就是词典,如果是[]就是数组,层层过滤
dict = [dict objectForKey:@"root"];
dict = [dict objectForKey:@"books"];
NSArray * arr = [dict objectForKey:@"book"];
//遍历数组并添加进书本管理
for (NSDictionary * dd in arr) {
//实例化一本书
BOOK *book = [BOOK new];
book.Id = [dd objectForKey:@"-id"];
book.language = [dd objectForKey:@"-language"];
book.name = [dd objectForKey:@"name"];
book.price = [[dd objectForKey:@"price"] doubleValue];
book.auther_name = [[dd objectForKey:@"auther"] objectForKey:@"name"];
book.summary = [dd objectForKey:@"summary"];
//添加书本进管理类中
[bm addBOOK:book];
}
//显示所有书本信息
//[bm showAllBook];
//下面这句语句是把所有书本按价格排序
[bm.dict sortUsingComparator:^NSComparisonResult(BOOK *b1,BOOK *b2){
return b2.price - b1.price;
}];
//NSLog(@"\n 排序之后:\n");
[bm showAllBook];
}
return 0;
}
============================================
运行结果: