JSON数据解析

来源:互联网 发布:nginx ip转发 编辑:程序博客网 时间:2024/06/06 10:06

今天教朋友解析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

最后效果



0 0