一、什么是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 = ; 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 = ; 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 = ; 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. iOS-登录认证/json解析

    用户输入用户名和密码,点击登录...我们把用户名和密码(用post方式或者get方式,get方式多用于测试看你需要)传给服务器,服务器进行判断,然后返回一个接口给我们(这里服务器返回的json接口,正 ...

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

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

  7. docker+k8s基础篇二

    Docker+K8s基础篇(二) docker的资源控制 A:docker的资源限制 Kubernetes的基础篇 A:DevOps的介绍 B:Kubernetes的架构概述 C:Kubernetes ...

  8. JavaScript笔记基础篇(二)

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

  9. iOS开发之Swift 4 JSON 解析指南

    Apple 终于在 Swift 4 的 Foundation 的模块中添加了对 JSON 解析的原生支持. 虽然已经有很多第三方类库实现了 JSON 解析,但是能够看到这样一个功能强大.易于使用的官方 ...

随机推荐

  1. JDK的安装与Java环境变量的配置详解

    JDK作为JAVA开发的环境,必须在电脑上安装JDK. 1.下载jdk http://rj.baidu.com/soft/detail/14459.html?ald下载jdk最新版jdk-8u11-w ...

  2. 【转】破解Source Insight 3.5.0072过程 附:安装软件+注册机

    转载地址:http://blog.csdn.net/qs_hud/article/details/8884867 注册机及软件下载地址:http://download.csdn.net/detail/ ...

  3. 在oneAPM参加第一个项目小结

    从12月15日开始加入进入oneAPM的第二个项目,也是我真正近距离接触项目的一次吧,到今天差不多接近尾声了,很高心能和大家一起共同改造这个项目,虽然说我做的贡献并不大,但是身临项目真的会收获很多体会 ...

  4. bzoj1007[HNOI2008]水平可见直线

    cycleke神说要用半平面交(其实他也用的凸包),把我吓了一跳,后来发现(看题解)其实可以先按斜率排序,再将最小的两条线入栈,如果其与栈顶元素的交点在上一个点的左边,则将栈顶元素出栈.这是一个开口向 ...

  5. Arduino学习经验(一)之解决舵机库和pwm输出冲突

    一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...

  6. css 水平垂直居中总结

    空闲总结了下水平垂直居中方案,欢迎补充: 水平居中 水平居中有两种情况: 子元素是内联元素 这种那个情况下只需要在父元素定义: text-align:center; 例子: html: //省略了bo ...

  7. word域2

    一.域应用基础 1.什么是域 简单地讲,域就是引导Word在文档中自动插入文字.图形.页码或其他信息的一组代码.每个域都有一个唯一的名字,它具有的功能与Excel中的函数非常相似.下面以Seq和Dat ...

  8. Boost学习笔记(三) progress_timer

    progress_timer也是一个计时器,它继承自timer,会在析构时自动输出时间,省去timer手动调用elapsed()的工作,是一个用于自动计时相当方便的小工具. #include < ...

  9. GZDBHelperDemo 一

    1.新建Window窗体项目GZDBHelperDemo 2.从Nuget添加GZDBHelper引用 添加完成后会出现GZDBHelper的引用 3.添加数据库链接管理类 添加类库文件:Databa ...

  10. JavaScript数组类型

    特点 动态长度 一个数组里面的元素可以是不同类型 数组的length属性不是只读属性,可通过length延长数组也可以删减数组的长度 定义数组两种方法 //方法一: var names = new A ...