JSON数据解析

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

最后效果



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值