码迷,mamicode.com
首页 > 移动开发 > 详细

ios基础篇(二十七)—— Json解析

时间:2016-01-06 15:25:05      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

一、什么是Json

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

1、Json的语法规则

(1)数据在键值对中

(2)数据由逗号分隔

(3)花括号保存对象

(4)方括号保存数组

Json和OC的转换:  大括号  { } ——NSDictionary

            中括号  [ ]  ——NSArray

            双引号  ” “  ——NSString

            数字8、8.1 ——NSNumber

2、JSON 数据的书写格式是:名称/值对

如:"Name":"John"

 

二、Json解析

在iOS中Json的常见解析方法有四种:

1、JSONKit

2、SBJson

3、TouchJSON

4、NSJSONSerialization

前三种是第三方框架(在使用第三方类库过程中,如果项目是支持ARC的话,而这些类库文件不支持ARC特性的话,就会遇到ARC问题保错,所以就要添加arc特性,即

添加-fno-objc-arc);

第四种是苹果原生方法(ios5之后),性能最好。

使用JSONKit、SBJson和TouchJSON需要下载他们的库;

TouchJson包下载: http://download.csdn.net/detail/enuola/4523169;

SBJson包下载: http://download.csdn.net/detail/enuola/4523177;

JSONKit包下载: http://download.csdn.net/detail/enuola/4523160;

 

本文主要介绍NSJSONSerialization的使用:

苹果官方文档是这样写的:

An object that may be converted to JSON must have the following properties://转换成JSON的对象必须具有如下属性

The top level object is an NSArray or NSDictionary.//顶层对象必须是NSArray或者NSDictionary

All objects are instances of NSString, NSNumber, NSArray, NSDictionary, or NSNull.//所有的对象必须是NSString、NSNumber、NSArray、NSDictionary、NSNull

All dictionary keys are instances of NSString.//所有NSDictionary的key必须是NSString类型

Numbers are not NaN or infinity.//数字对象不能是非数值或无穷

下面就看个NSJSONSerialization解析实例:

{                      

 "Name" :      "奥巴马" ,

"ByName" :    ["小奥","小巴","小马"],

"Education" : {

               "GradeSchool" :  "华盛顿第一小学",

               "MiddleSchool" : ["华盛顿第一初中" , "华盛顿第一高中"],

               "University" :  { 

                                 "Name" : "哈佛大学",

                                 "Specialty" : ["软件工程","会计"]

                               }

              }

}

首先我们先来分析一下这段文字;

{}之前说过表示NSDictionary;NSDictionary中包含三个key("Name"/"ByName"/"Education")分别对应其Value;Value下又包括NSString、NSArray。

下面看demo:

//
//  ViewController.m
//  NSJSONSerialization
//
//  Created by Oran Wu on 16-1-5.
//  Copyright (c) 2016年 MO. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    [self sample];
}

- (void)sample{
    NSError *error;
    //获取json文件路径,根据路径来获取里面的数据
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Json" ofType:@"txt"];
    NSString *contents = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
    if (!error) {
        //将请求的数据放到NSData对象中
        NSData *data = [contents dataUsingEncoding:NSUTF8StringEncoding];
        //解析服务端返回的json格式数据
        id jsonObjet = [NSJSONSerialization JSONObjectWithData:data
                                                       options:NSJSONReadingAllowFragments
                                                         error:&error];
        
//        typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions) {
//            //将解析的数组和字典设置为可变对象
//            NSJSONReadingMutableContainers = (1UL << 0),
//            //将解析数据的子节点创建为可变字符串对象
//            NSJSONReadingMutableLeaves = (1UL << 1),
//            //允许解析对象的最上层不是字典或者数组
//            NSJSONReadingAllowFragments = (1UL << 2)
//       }
        
        NSLog(@"jsonObjet:%@",jsonObjet);
        //根据得到的键值对通过key来得到对应的值,也就是值里面的数组
        NSArray *byName = [jsonObjet objectForKey:@"ByName"];
        
        for (int i = 0; i < byName.count; i++){
            //获取数组中的键值对
            NSString *name = [byName objectAtIndex:i];
            NSLog(@"name:%@",name);
        }
        
        NSDictionary *education = [jsonObjet objectForKey:@"Education"];
        NSLog(@"Education:%@",education);
        
        NSString *gradeSchool = [education objectForKey:@"GradeSchool"];
        NSLog(@"GradeSchool:%@",gradeSchool);
        
        NSArray *middleSchool = [education objectForKey:@"MiddleSchool"];
        
        for (int i = 0; i < middleSchool.count; i++) {
            NSString *middle = [middleSchool objectAtIndex:i];
            NSLog(@"MiddleSchool:%@",middle);
        }
        
        NSDictionary *university = [education objectForKey:@"University"];
        NSLog(@"University:%@",university);
        
        NSString *name = [university objectForKey:@"Name"];
        NSLog(@"Name:%@",name);
        
        NSArray *specialty = [university objectForKey:@"Specialty"];
        
        for (int i = 0; i < specialty.count; i++) {
            NSString *spec = [specialty objectAtIndex:i];
             NSLog(@"Specialty:%@",spec);
        }
        
        NSString *Name = [jsonObjet objectForKey:@"Name"];
        NSLog(@"Name:%@",Name);
    }
}

 

ios基础篇(二十七)—— Json解析

标签:

原文地址:http://www.cnblogs.com/0320y/p/5105036.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!