今天教朋友解析Json数据有一些要注意的地方在这里和大家交流一下
先展示一下数据
{
"version": "0.1",
"time": "2014-11-20 00:00:00",
"main_app_id": "-1",
"loop_delay": 5,
"more_apps": [
{
"bundle_id": "com.cocoplay.cocoiceprincess",
"url_scheme": "cocoiceprincess://",
"id": 001,
"icon": "http://cocoplay.com/moreapps/icons/icon-iceprincess.png",
"promotion_url": "",
"promotion_url_deep_amazon": "",
"bundle_id_googleplay": "",
"promotion_url_googleplay": "",
"name": {
"en": "",
"zh-Hans": ""
},
"description": {
"en": "",
"zh-Hans": ""
},
"content_image": {
"en": "",
"zh-Hans": ""
}
},
{
"bundle_id": "com.cocoplay.cocomia",
"url_scheme": "cocomia://",
"id": 002,
"icon": "http://cocoplay.com/moreapps/icons/icon-mia.png",
"promotion_url": "",
"promotion_url_deep_amazon": "",
"bundle_id_googleplay": "",
"promotion_url_googleplay": "",
"name": {
"en": "",
"zh-Hans": ""
},
"description": {
"en": "",
"zh-Hans": ""
},
"content_image": {
"en": "",
"zh-Hans": ""
}
},
{
"bundle_id": "com.cocoplay.cocopony",
"url_scheme": "cocopony://",
"id": 003,
"icon": "http://cocoplay.com/moreapps/icons/icon-pony.png",
"promotion_url": "",
"promotion_url_deep_amazon": "",
"bundle_id_googleplay": "",
"promotion_url_googleplay": "",
"name": {
"en": "",
"zh-Hans": ""
},
"description": {
"en": "",
"zh-Hans": ""
},
"content_image": {
"en": "",
"zh-Hans": ""
}
},
{
"bundle_id": "com.cocoplay.cocostar",
"url_scheme": "cocostar://",
"id": 004,
"icon": "http://cocoplay.com/moreapps/icons/icon-star.png",
"promotion_url": "",
"promotion_url_deep_amazon": "",
"bundle_id_googleplay": "",
"promotion_url_googleplay": "",
"name": {
"en": "",
"zh-Hans": ""
},
"description": {
"en": "",
"zh-Hans": ""
},
"content_image": {
"en": "",
"zh-Hans": ""
}
}
]
}
这是一个标准的数据格式,但是我们在解析之前需要注意一下json数据中是否有\n\r\t等制表符,否则NSData不会校验通过会报
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)"错误
另外里面含有id特殊字符我解析的时候是将其去掉了的,否则也会报如上错误
下面展示我的解析代码
这里建立JsonFile对象:
//
// JsonFile.h
// JsonDemo
//
// Created by SPF on 16/1/26.
// Copyright (c) 2016年 SPF. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface JsonFile : NSObject
@property (nonatomic,copy)NSString*bundle_id;
@property (nonatomic,copy)NSString*url_scheme;
@property (nonatomic,copy)NSString*icon;
- (instancetype)initWithbundle_id:(NSString *)bundle_id url_scheme:(NSString *)url_scheme icon:(NSString *)icon;
@end
//
// JsonFile.m
// JsonDemo
//
// Created by SPF on 16/1/26.
// Copyright (c) 2016年 SPF. All rights reserved.
//
#import "JsonFile.h"
@implementation JsonFile
-(instancetype)initWithbundle_id:(NSString *)bundle_id url_scheme:(NSString *)url_scheme icon:(NSString *)icon{
if (self = [super init]) {
_bundle_id =bundle_id;
_url_scheme =url_scheme;
_icon =icon;
}
return self;
}
-(NSString *)description{
return [NSString stringWithFormat:@"\nbundle_id:%@\nurl_scheme:%@\nicon:%@",_bundle_id,_url_scheme,_icon];
}
@end
//
// RootViewController.m
// JsonDemo
//
// Created by SPF on 16/1/26.
// Copyright (c) 2016年 SPF. All rights reserved.
//
#import "RootViewController.h"
#import "JsonFile.h"
#define PATH @"/Users/xiepei/Desktop/JsonDemo/bride_moreapps.json"
@interface RootViewController ()
@property (nonatomic,strong)NSMutableArray *mArry;
@property (nonatomic,strong)NSMutableArray *iconUrl;
@end
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self analysisJson];
[self creatImageView];
}
-(void)analysisJson{
//1、定义一个可变数组,用于存储解析到的信息
_mArry=[[NSMutableArray alloc]init];
_iconUrl=[[NSMutableArray alloc]init];
//2、读取文件内容
NSData *data =[NSData dataWithContentsOfFile:PATH];
//3、将其转换为JSON对象
NSError *error;
id root=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
NSLog( @"%@",error);
//4、取出需要解析的内容其它的可忽略
id more_apps=[root objectForKey:@"more_apps"];
//5、我们已经知道ore_apps是一个数组,所以遍历解析
for (id obj in more_apps) {
NSString *bundle_id=[obj objectForKey:@"bundle_id"];
NSString *url_scheme=[obj objectForKey:@"url_scheme"];
NSString *icon=[obj objectForKey:@"icon"];
//创建JsonFile对象,保存解析的信息
JsonFile *Json=[[JsonFile alloc]initWithbundle_id:bundle_id url_scheme:url_scheme icon:icon];
//将解析到的JsonFile对象保存到数组中
[_mArry addObject:Json];
//这个数组专门存储url
[_iconUrl addObject:icon];
}
//在这里打印解析出来的数据
for (id obj in _mArry) {
NSLog(@"%@", obj);
}
}
-(void)creatImageView{
CGFloat width=self.view.frame.size.width/_mArry.count;
for (int i=0; i<_mArry.count; i++) {
UIImageView *image=[[UIImageView alloc]initWithFrame:CGRectMake(i*width, 64, width, width)];
NSURL *url=[NSURL URLWithString:_iconUrl[i]];
NSData *data=[NSData dataWithContentsOfURL:url];
image.image=[UIImage imageWithData:data];
[self.view addSubview:image];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
最后效果