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;
}
============================================
運行結果: