关于网络开发中JSON的使用

JSON是一种轻量级的数据交换格式,非常适合网络间的数据交互。JSON的格式和OC中的字典和数组类似。

key-value格式的:

{“name”:“Tom”, "age":20}

数组格式的:

["Tom", "Jack"]

在iOS开发中如果要使用JSON,就需要对JSON进行解析。在iOS中,JSON的解析方案主要有以下四中解析方案:

1、NSJSONSerialization

2、JSONKit

3、SBJson

4、TouchJSON

上面四种方案从上到下性能越来越差,其中第一个方案是苹果自带解决方案,性能最优,推荐这种方案。后面三种属于第三方框架,可以在Github上面进行了解。下面着重说一下NSJSONSerialization。

1、JSON转OC对象

JSON转OC对象有两个类方法

+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

+ (id)JSONObjectWithStream:(NSInputStream *)stream options:(NSJSONReadingOptions)opt error:(NSError **)error;

第一个类方法是通过NSData的类型的JSON数据创建OC对象,第二种是通过NSInputStream类型的JSON数据流创建OC对象,option参数的作用源码有如下注释:

Set the NSJSONReadingAllowFragments option if the parser should allow top-level objects that are not an NSArray or NSDictionary. Setting the NSJSONReadingMutableContainers option will make the parser generate mutable NSArrays and NSDictionaries. Setting the NSJSONReadingMutableLeaves option will make the parser generate mutable NSString objects.

NSJSONReadingMutableContainers: 返回可变容器,如NSMutableArray、NSMutableDictionary

NSJSONReadingMutableLeaves: 返回NSMutableString对象

NSJSONReadingAllowFragments: 允许JSON字符串最外层既不是数组也不是字典,但必须是有效的JSON Fragment,例如@"123"。下面看测试代码:

- (void)sendDemo0 {
    //验证用户名是否为空
    NSString *userName = self.userNameField.text;
    if (userName.length<=0) {
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
        [hud hide:YES afterDelay:1];
        [hud setLabelText:@"用户名不能为空"];
        [hud setMode:MBProgressHUDModeCustomView];
        return;
    }
    //验证密码是否为空
    NSString *pwd = self.userPwdField.text;
    if (pwd.length<=0) {
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[UIApplication sharedApplication].windows.lastObject animated:YES];
        [hud hide:YES afterDelay:1];
        [hud setLabelText:@"密码不能为空"];
        [hud setMode:MBProgressHUDModeCustomView];
        return;
    }
    //显示一个加载框
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[UIApplication sharedApplication].windows.lastObject animated:YES];
    hud.labelText = @"正在加载";
    hud.dimBackground = YES;
    hud.removeFromSuperViewOnHide = YES;

    //发送HTTP请求,进行登录
    NSString *str = [NSString stringWithFormat:@"http://localhost:8080/MJServer/login?username=%@&pwd=%@", userName, pwd];
    NSURL *url = [NSURL URLWithString:str];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        //对返回的数据进行处理,例如json解析
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        //显示提示信息
        MBProgressHUD *messageHud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
        messageHud.removeFromSuperViewOnHide = YES;
        messageHud.mode = MBProgressHUDModeText;
        [messageHud show:YES];
        NSString *error = [dict objectForKey:@"error"];
        if (error) {
            messageHud.labelText = error;
        }else {
            messageHud.labelText = [dict objectForKey:@"success"];
        }
        [messageHud hide:YES afterDelay:1];

        [hud hide:YES];
    }];

}

MBProgressHUD是第三方框架,用来显示一个加载框或者消息提示框,NSURLConnection是用来发送网络请求获取json数据的,这两个类现在这用,以后专门说一下。

2、OC对象转JSON

OC对象转JSON有一个静态方法:

+ (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

参数obj应该是一个有效的JSON格式,如果提供了一个无效的JSON,这个方法将会抛出异常,检测是否有效用这个方法:

+ (BOOL)isValidJSONObject:(id)obj;

如果有效则返回YES,否则返回NO,有效的对象必须有以下属性:

    - Top level object is an NSArray or NSDictionary
    - All objects are NSString, NSNumber, NSArray, NSDictionary, or NSNull
    - All dictionary keys are NSStrings
    - NSNumbers are not NaN or infinity

最外层的对象时NSArray或者NSDictionary,里面的对象是NSString、NSNumber、NSArray、NSDictionary或者NSNull,所有字典的key必须是NSString类型,NSNumber不能是NaN或者无穷大。

opt参数只有一个选择:NSJSONWritingPrettyPrinted,

Setting the NSJSONWritingPrettyPrinted option will generate JSON with whitespace designed to make the output more readable.

设置这个参数后可以格式化JSON数据,使输出结果更可读。测试代码如下:(接着上面的测试代码)

NSData *data1 = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
        NSString *str = [[NSString alloc] initWithData:data1 encoding:NSUTF8StringEncoding];
        NSLog(@"str:%@", str);

输出结果如下:

2015-06-30 10:13:48.308 HttpDemo[56455:607] str:{
  "error" : "用户名不存在"
}

最后附上测试demo:Demo

时间: 2024-12-09 13:21:26

关于网络开发中JSON的使用的相关文章

微信开发中json与xml数据处理

写在前面的话:微信开发中,许多信息是通过json与xml格式来进行通信的,下面写一小总结. =====正文开始====== 一.json数据处理:json_decode 1.假设接收的json数据如下: $json='{"access_token":"o6_bmjrPTlm6_2sgVt7hMZOPfL2M","expires_in":7200}'; 2.通过json_decode($json),将字符串的json数据转化为PHP对象的形式: $

iOS开发系列--网络开发

iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 50097 阅读, 53 评论, 收藏,  编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession

第八章 网络的时代—网络开发(4)

8.5轻量级的数据交换格式-JSON 8.5.1 client与server端的数据交互 在Android应用开发中,尤其是网络应用的开发,我们常常须要从网络上获取数据,而不只从本地数据库或者本地文件里取得数据,这个时候就涉及到client与server端的数据交互了.client怎样须要与server端进行数据交互.就须要约定一种协议或者是数据交换格式. 那么一般的.Androidclient与server端进行数据交互有哪些方式呢?依据业务需求的不同,可能会选用不用的方式,通常有以下几种方式

Android中JSON数据使用

JSON(JavaScript Object Notation) :一种轻量级的数据交换格式,基于JavaScript的一个子集. JSON采用完全独立于语言的文本格式,使JSON成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成(网络传输速度快).作为一种数据交换格式,JSON优势很明显(相对与我们通常使用的XML):JSON比XML体积小;JSON和JavaScript交互更加方便;JSON的速度要远远大于XML;JSON的解析要比XML的解析要方便等. JSON语法规则:

iOS网络开发(1)写代码前需要了解的

从本篇文章开始,介绍一些网络开发中用到的技术. iOS的网络开发中,特别是应用开发,使用Http协议作为主要的通信手段 写代码前,先了解一些与协议相关联的内容,包括: URL的概念 HTTP与HTTPS HTTP请求的内容及请求对象 HTTP应答的内容及请求对象 URL URL:统一资源标示符,可以表示一个资源的路径,这个路径可以是本地的.网络上的. URL是对可以从互联网上得到的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址. 互联网上每一个文件都有唯一一个URL,它包含的信息指出文

IOS网络开发概述

概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession 数据请求 文件上传 文件下载 会话 UIWebView 浏览器实现 UIWebView与页面交互 网络状态 目 录 Web请求和响应 使用代理

iOS开发系列--网络开发网络联网程序

概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession 数据请求 文件上传 文件下载 会话 UIWebView 浏览器实现 UIWebView与页面交互 网络状态 目 录 Web请求和响应 使用代理

ios网络开发

概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession 数据请求 文件上传 文件下载 会话 UIWebView 浏览器实现 UIWebView与页面交互 网络状态 目 录 Web请求和响应 使用代理

Unity3d Android Http 开发中的坑(吐槽

在一般的U3D网络开发中,直接使用WWW类便足够正常使用,但我在发现使用WWW下载大文件时,会导致整个程序卡顿的情况(不清楚是否我个人电脑问题),所以干脆使用HttpWebRequest/HttpWebResponse + await/async 来代替WWW. U3D中还是在使用比较低的Mono版本,所以是不支持(await/async)的.准确来说是不支持Task<T>,而且还有些BUG(我自个能确定的就有两个),现在最希望就是U3D更新Mono版本,写代码就可以更爽了! 无奈之下,只有参