一、什么是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"];

        ; 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"];

        ; 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"];

        ; i < specialty.count; i++) {
            NSString *spec = [specialty objectAtIndex:i];
             NSLog(@"Specialty:%@",spec);
        }

        NSString *Name = [jsonObjet objectForKey:@"Name"];
        NSLog(@"Name:%@",Name);
    }
}

ios基础篇(二十七)—— Json解析的更多相关文章

  1. 篇二:JSON解析

    前台以json形式的数据格式传到后台,代码如下: import net.sf.json.JSONObject; public class JsonUtility { /** * 解析JSON 对象为对 ...

  2. iOS基础篇(十七)——UIGestureRecognizer用法

    UIGestureRecognizer(手势识别)在iOS 中非常重要,他极大地提高了移动设备的使用便捷性: 在3.2之前是主要使用的是由UIResponder而来的如下4种方式: - (void)t ...

  3. ios 网络数据下载和JSON解析

    ios 网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍ios中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载 ...

  4. php基础篇-二维数组排序 array_multisort

    原文:php基础篇-二维数组排序 array_multisort 对2维数组或者多维数组排序是常见的问题,在php中我们有个专门的多维数组排序函数,下面简单介绍下: array_multisort(a ...

  5. Qt入门之基础篇 ( 二 ) :Qt项目建立、编译、运行和发布过程解析

    转载请注明出处:CN_Simo. 题解: 本篇内容主讲Qt应用从创建到发布的整个过程,旨在帮助读者能够快速走进Qt的世界. 本来计划是讲解Qt源码静态编译,如此的话读者可能并不能清楚地知道为何要静态编 ...

  6. JavaScript笔记基础篇(二)

    基础篇主要是总结一些工作中遇到的技术问题是如何解决的,应为本人属于刚入行阶段技术并非大神如果笔记中有哪些错误,或者自己的一些想法希望大家多多交流互相学习. 1.ToFixed()函数 今天在做Birt ...

  7. NIO相关基础篇二

    转载请注明原创出处,谢谢! 上篇NIO相关基础篇一,主要介绍了一些基本的概念以及缓冲区(Buffer)和通道(Channel),本篇继续NIO相关话题内容,主要就是文件锁.以及比较关键的Selecto ...

  8. node基础篇二:模块、路由、全局变量课堂(持续)

    今天继续更新node基础篇,今天主要内容是模块.路由和全局变量. 模块这个概念,在很多语言中都有,现在模块开发已经成为了一种潮流,它能够帮助我们节省很多的时间,当然咱们的node自然也不能缺少,看下例 ...

  9. ios基础篇(二十九)—— 多线程(Thread、Cocoa operations和GCD)

    一.进程与线程 1.进程 进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内: 如果我们把CPU比作一个工厂,那么进程就好比工厂的车间,一个工厂有 ...

随机推荐

  1. H5 Notes:Navigator Geolocation

    H5的地理位置API可以帮助我们来获取用户的地理位置,经纬度.海拔等,因此我们可以利用该API做天气应用.地图服务等. Geolocation对象是我们获取地理位置用到的对象. 首先判断浏览器是否支持 ...

  2. linux进程后台运行及输出重定向

    本机环境为ubuntu 14.04 以ping www.baidu.com为例: 1.程序的前台运行 ping www.baidu.com 可以看到,屏幕上输出了baidu返回的结果 2.实现程序后台 ...

  3. FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码

    FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.Model 利用T4模板,[MultipleOutputHelper.ttinclude]批量生成多文件 ...

  4. vba单元格背景色

    cells(i,j).interior.color=5287936  green =255 red

  5. iOS网络请求之multipart/form-data提交数据

    multipart/form-data表单数据 在http网络请求中,post没有请求长度的限制,因为post把数据放在了body中,而不是像Get一样放在了浏览器的地址栏中(可以这么理解), 所以相 ...

  6. PN结的单向导电性及PN结的电流方程及PN结电容

    PN结加正向电压 当PN结外加正向电压时,外电场将多数载流子推向空间电荷区,使其变窄,削弱了内电场,破坏了原来的平衡,使扩散运动加剧,PN结导通.PN结的压降只有零点几付,所以在其回路里应串联一个电阻 ...

  7. MVC Return View() 和 Return PartialView()的区别

    分部视图在action中返回一定要用PartialView(),而不要偷懒使用View(),因为,如果你使用View()渲染视图,系统会认为你是一个标准视图,会为你加个默认的母板页(Layout),除 ...

  8. systemd在各个linux发行版的普及

    后面我要说下自己的意见: 原则如果阻碍了进步,那还算个屁,不客气地说,UNIX 原则已经过时了. 移植性问题:我除了 Mac 外不用任何 BSD 系统,当然 Mac 上一般只做开发不做运维(但就算如此 ...

  9. 改变DataGrid某一行和单元格的颜色

    前段时间做WPF项目,需要改变DataGrid某一行的颜色.高度,以及某个单元格的颜色.单元格字体的颜色,自然就必需取到datagrid的一行和一行的单元格,网上也是搜索了好久才找到,记录下来便于使用 ...

  10. 数据库 使用DML语句更改数据

    使用DML语句更改数据 添加新数据: 插入单行语句: Insert into 表名(列名)values(‘值’); 插入多行:insert into 表名(列名,…..) Values(‘值’,’值’ ...