谈谈iOS开发之JSON格式数据的生成与解析

本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解:

一、JSON是什么?

二、我们为什么要用JSON格式的数据?

三、如何生成JSON格式的数据?

四、如何解析JSON格式的数据?

JSON格式取代了xml给网络传输带来了很大的便利,但是却没有了xml的一目了然,尤其是json数据很长的时候,我们会陷入繁琐复杂的数据节点查找中。这时我们就需要一款在线校验工具 BeJson。

一、JSON是什么?

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

JSON数据主要有两种数据结构,一种是键/值,另一种是数组的形式来表示。

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

{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"} 

2、JSON 数据的书写格式是:数组格式,当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。如:

{
  "programmers": [{
    "firstName": "Brett",
    "lastName": "McLaughlin",
    "email": "aaaa"
  }, {
    "firstName": "Elliotte",
    "lastName": "Harold",
    "email": "cccc"
  }],
  "authors": [{
    "firstName": "Isaac",
    "lastName": "Asimov",
    "genre": "sciencefiction"
  }, {
    "firstName": "Frank",
    "lastName": "Peretti",
    "genre": "christianfiction"
  }],
  "musicians": [{
    "firstName": "Eric",
    "lastName": "Clapton",
    "instrument": "guitar"
  }, {
    "firstName": "Sergei",
    "lastName": "Rachmaninoff",
    "instrument": "piano"
  }]
}

二、我们为什么要用JSON格式的数据?

JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是JavaScript很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。

JSON作为数据包格式传输的时候具有更高的效率,这是因为JSON不像XML那样需要有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输压力。

三、如何生成JSON格式的数据?

1、利用字典NSDictionary转换为键/值格式的数据。

// 如果数组或者字典中存储了 NSString, NSNumber, NSArray, NSDictionary, or NSNull 之外的其他对象,就不能直接保存成文件了.也不能序列化成 JSON 数据.
  NSDictionary *dict = @{@"name" : @"me", @"do" : @"something", @"with" : @"her", @"address" : @"home"};

  // 1.判断当前对象是否能够转换成JSON数据.
  // YES if obj can be converted to JSON data, otherwise NO
  BOOL isYes = [NSJSONSerialization isValidJSONObject:dict];

  if (isYes) {
    NSLog(@"可以转换");

    /* JSON data for obj, or nil if an internal error occurs. The resulting data is a encoded in UTF-8.
     */
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL];

    /*
     Writes the bytes in the receiver to the file specified by a given path.
     YES if the operation succeeds, otherwise NO
     */
    // 将JSON数据写成文件
    // 文件添加后缀名: 告诉别人当前文件的类型.
    // 注意: AFN是通过文件类型来确定数据类型的!如果不添加类型,有可能识别不了! 自己最好添加文件类型.
    [jsonData writeToFile:@"/Users/SunnyBoy/Sites/JSON_XML/dict.json" atomically:YES];

    NSLog(@"%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);

  } else {

    NSLog(@"JSON数据生成失败,请检查数据格式");

  }

2、通过JSON序列化可以转换数组,但转换结果不是标准化的JSON格式。

   NSArray *array = @[@"qn", @18, @"ya", @"wj"];

  BOOL isYes = [NSJSONSerialization isValidJSONObject:array];

  if (isYes) {
    NSLog(@"可以转换");

    NSData *data = [NSJSONSerialization dataWithJSONObject:array options:0 error:NULL];

    [data writeToFile:@"/Users/SunnyBoy/Sites/JSON_XML/base" atomically:YES];

  } else {

    NSLog(@"JSON数据生成失败,请检查数据格式");

  }

四、如何解析JSON格式的数据?

1、使用TouchJSon解析方法:(需导入包:#import "TouchJson/JSON/CJSONDeserializer.h")

//使用TouchJson来解析北京的天气
//获取API接口
NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"];

//定义一个NSError对象,用于捕获错误信息
NSError *error;
NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

NSLog(@"jsonString--->%@",jsonString);

//将解析得到的内容存放字典中,编码格式为UTF8,防止取值的时候发生乱码
NSDictionary *rootDic = [[CJSONDeserializer deserializer] deserialize:[jsonString dataUsingEncoding:NSUTF8StringEncoding] error:&error];

//因为返回的Json文件有两层,去第二层内容放到字典中去
NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
NSLog(@"weatherInfo--->%@",weatherInfo);

//取值打印
NSLog(@"%@",[NSString stringWithFormat:@"今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]]);

2、使用SBJson解析方法:(需导入包:#import "SBJson/SBJson.h")

//使用SBJson解析北京的天气
NSURL *url = [NSURL URLWithString:@"http://www.weather.com.cn/adat/sk/101010100.html"];

NSError *error = nil;

NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

SBJsonParser *parser = [[SBJsonParser alloc] init];

NSDictionary *rootDic = [parser objectWithString:jsonString error:&error];

NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];

NSLog(@"%@", [NSString stringWithFormat:@"今天是 %@ %@ %@ 的天气状况是:%@ %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]]);

3、使用IOS5自带解析类NSJSONSerialization方法解析:(无需导入包,IOS5支持,低版本IOS不支持)

// 从中国天气预报网请求数据
  NSURL *url = [ NSURL URLWithString:@"http://www.weather.com.cn/adat/sk/101010100.html"];

  // 创建请求
  NSURLRequest *request = [NSURLRequest requestWithURL:url];

  [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

    // 在网络完成的 Block 回调中,要增加错误机制.
    // 失败机制处理: 错误的状态码!

    // 最简单的错误处理机制:
    if (data && !error) {

      // JSON格式转换成字典,IOS5中自带解析类NSJSONSerialization从response中解析出数据放到字典中
      id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];

      NSDictionary *dict = obj[@"weatherinfo"];

      NSLog(@"%@---%@", dict, dict[@"city"]);
    }

  }] resume];

4、使用JSONKit的解析方法:(需导入包:#import "JSONKit/JSONKit.h")

//如果json是“单层”的,即value都是字符串、数字,可以使用objectFromJSONString
NSString *json1 = @"{\"a\":123, \"b\":\"abc\"}";
NSLog(@"json1:%@",json1);

NSDictionary *data1 = [json1 objectFromJSONString];
NSLog(@"json1.a:%@",[data1 objectForKey:@"a"]);
NSLog(@"json1.b:%@",[data1 objectForKey:@"b"]);

//如果json有嵌套,即value里有array、object,如果再使用objectFromJSONString,程序可能会报错(测试结果表明:使用由网络或得到的php/json_encode生成的json时会报错,但使用NSString定义的json字符串时,解析成功),最好使用objectFromJSONStringWithParseOptions:
NSString *json2 = @"{\"a\":123, \"b\":\"abc\", \"c\":[456, \"hello\"], \"d\":{\"name\":\"张三\", \"age\":\"32\"}}";
NSLog(@"json2:%@", json2);

NSDictionary *data2 = [json2 objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];
NSLog(@"json2.c:%@", [data2 objectForKey:@"c"]);
NSLog(@"json2.d:%@", [data2 objectForKey:@"d"]);

友好提示:

4中解析方式的对比:

系统的API的解析速度最快。

SBJSON的解析速度为倒数第二差。

与系统API较为接近的是JSONKit。

在今后的开发过程中,建议选用系统的API或JSONKit来对JSON数据进行解析。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • IOS json 解析遇到错误问题解决办法

    概要: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn't be completed. (Cocoa error 3840.)" (Unescaped control character around character 1419.) UserInfo=0x1563cdd0 {NSDebugDescription=Unescaped control character around character 14

  • 详解iOS开发中解析JSON中的boolean类型的数据遇到的问题

    问题描述: Xcode中打印的JSON数据: { content = { createTime = 1462512975497; expiryDate = 1475137813; id = 204; intervalSeconds = 0; lastHgt = "63.689"; lastLat = "39.9621096"; lastLng = "116.3175201"; lastTime = 1462848844; manage = 1;

  • iOS中json解析出现的null,nil,NSNumber的解决办法

    在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式. JSON建构有两种结构: json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组2种结构,通过这两种结构可以表示各种复杂的结构 1.对象:对象在js中表示为"{}"扩起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象.key 获取属性

  • 详解iOS通过ASIHTTPRequest提交JSON数据

    先验知识--什么是ASIHTTPRequest? 使用iOS SDK中的HTTP网络请求API,相当的复杂,调用很繁琐,ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中.ASIHTTPRequest适用于基本的HTTP请求,和基于REST的服务之间的交互. 上传JSON格式数据 首先给出主功能代码段,然后对代码进行详细解析: NSDictiona

  • IOS中Json解析实例方法详解(四种方法)

    作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此"http://www.bejson.com/"网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的iOS版本,可以使用第三方库来解析Json. 本文将介绍Tou

  • IOS开发之JSON转PLIST实例详解

     IOS JSON转PLIST 从xx.json文件中读取JSON数据,写入到xx.plist文件中,实现代码如下: NSString *path = @"/Users/android_ls/Desktop/city_province.json"; NSArray *array = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:path] options:NSJSONReadingMutab

  • iOS json解析出错的几种情况总结

    iOS json解析出错 对于json格式,我们并不陌生,但是因为它处于不同的语言标准也不一致.分享一下最近项目出现的json问题: 1.编码问题,在不清楚服务端的编码格式的情况下,我直接使用: NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]; NSError *error = nil; NSArray *arr = [NSJSONSerialization JSONObjectWithD

  • iOS开发使用JSON解析网络数据

    前言:对服务器请求之后,返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 本篇随便先讲解JSON解析. 正文: 关于JSON: JSON是一种轻量级的数据格式,一般用于数据交互JSON的格式很像Objective-C中的字典和数组:{"name":"jack","age":10} 补充: 标准的JSON格式的注意点:key必须用双引号.(但是在Java中是单引号) JSON-OC的转换对照表 其中:null--返回OC里的N

  • 谈谈iOS开发之JSON格式数据的生成与解析

    本文将从四个方面对IOS开发中JSON格式数据的生成与解析进行讲解: 一.JSON是什么? 二.我们为什么要用JSON格式的数据? 三.如何生成JSON格式的数据? 四.如何解析JSON格式的数据? JSON格式取代了xml给网络传输带来了很大的便利,但是却没有了xml的一目了然,尤其是json数据很长的时候,我们会陷入繁琐复杂的数据节点查找中.这时我们就需要一款在线校验工具 BeJson. 一.JSON是什么? JSON(JavaScript Object Notation) 是一种轻量级的数

  • PHP JSON格式数据交互实例代码详解

    在PHP中解析JSON主要用到json_encode和json_decode两个PHP JSON函数,比PHP解析XML方便很多,下面详细介绍下PHP JSON的使用.JSON基础介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON主要有两种结构: "名称/值"对的集合,在PHP中可以理解为关联数组 (associative array). 值的有序列表(An ordered list of values).在PHP中可以理解为

  • SpringBoot整合Web开发之Json数据返回的实现

    目录 本章概要 返回JSON数据 默认实现 自定义转换器 1. 使用Gson 2. 使用fastjson 静态资源访问 默认策略 自定义策略 1. 在配置文件中定义 2. Java编码定义 本章概要 返回JSON数据 静态资源访问 返回JSON数据 默认实现 JSON 是目前主流的前后端数据传输方式,Spring MVC中使用消息转换器HTTPMessageConverter对JSON的转换提供了很好的支持,在Spring Boot中更进一步,对相关配置做了进一步的简化.默认情况下,创建一个Sp

  • IOS 开发之NSDictionary转换成JSON字符串

    IOS 开发之NSDictionary转换成JSON字符串 普通情况下,你可能会用一个NSDictionary的分类去做NSDictionary转JSON,如下代码: NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:&error]; if (! jsonData) { return @"{}&qu

  • IOS 开发之Object-C中的对象详解

    IOS 开发之Object-C中的对象详解 前言 关于C语言的基础部分已经记录完毕,接下来就是学习Object-C了,编写oc程序需要使用Foundation框架.下面就是对oc中的对象介绍. 对象 对象和结构类似,一个对象可以保存多个相关的数据.在结构中,我们称这些数据为成员.而在对象中,称这些数据为实例变量.除了这些以外,对象和结构不用之处在于,对象还可以包含一组函数,并且这些函数可以使用对象所保存的数据,这类函数称为方法. 类 类(class)负责描述某个特点类型的对象,其中包括方法和实例

  • jQuery 开发之EasyUI 添加数据的实例

    jQuery 开发之EasyUI 添加数据的实例 1.创建toolbar: toolbar:[{ text:'增加', iconCls:'icon-add', handler:function(){ openAddUserDialog(); } }] 2.添加dialog,里面有添加用户的表单 <div id="addDialog" data-options="closed:true,modal:true,title:'addUser', buttons:[{ text

  • IOS开发之UIScrollView实现图片轮播器的无限滚动

    IOS开发之UIScrollView实现图片轮播器的无限滚动 简介 在现在的一些App中常常见到图片轮播器,一般用于展示广告.新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScrollView的允许分页设置,可以实现滚动轮播的功能. 轮播原理 UIScrollView对象有pagingEnable成员,如果设置为YES,那么每一个scrollView尺寸这么大的区域就会被当作一页,在滚动时会根据滚动的比例自动计算应该切换到哪一页. 无限滚动原理 要实现无限滚动,需要额外的两

  • IOS开发之@property的详细介绍

    IOS开发之@property的详细介绍 在类中定义属性时,总会使用到@property进行定义,下面就来说说@property的使用. 在使用过程中,如果需求公开且在其他类中使用时,通常会定义在.h头文件中:而如果只是该类自已需要使用,这时则会定义 在.m实现文件中. 使用格式 @property (参数1, 参数2, 参数3, ...) 参数类型 参数名称 参数包括三个种类,七个属性,如下图所示. 在使用过程中,有几点需要注意: (1)原子性定义中,如果没有涉及到多线程环境时,通常不会使用默

  • iOS开发之UITableView与UISearchController实现搜索及上拉加载,下拉刷新实例代码

    废话不多说了,直接给大家贴代码了. 具体代码如下所示: #import "ViewController.h" #import "TuanGouModel.h" #import "TuanGouTableViewCell.h" #define kDeviceWidth [UIScreen mainScreen].bounds.size.width #define kDeviceHeight [UIScreen mainScreen].bounds.

随机推荐