JSON数据解析(转)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式。
本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析。
1.JSON数据结构
在JSON中有两种数据结构:对象和数组。
1.1对象
在JSON中,一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号),冒号后是该名称的值,多个“名称:值”之间使用 “,”(逗号)分隔开来。名称需要使用双引号括起来,值如果是字符串则必须用双引号括起来,如果是数值型则不需要。其结构示意图如图1所示。
图1 JSON对象结构示意图
如下的代码是一个简单的JSON对象示例:
1 {
2 "id":001,
3 "name":"jack",
4 "age":25
5 }
1.2数组
在JSON中,数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用 “,”(逗号)分隔开来。其结构示意图如图2所示。
图2 JSON数组结构示意图
如下的代码是一个简单的JSON数组示例:
["北京","上海","广州"]
1.3值的类型
在JSON的对象和数组结构中,value值不仅可以是数字、字符串等简单数据类型,还可以是对象、数组等,如图3所示。
图3 JSON中值的类型
因此,我们可以使用对象和数组的组合构成复杂的数据结构。如下的代码使用对象结构定义了一个“students”对象,在“students”对象中包含了一个学生数组,而学生数组中的值又是JSON对象。

1 {
2 "students":
3 [
4 {"name":"jack","age":23},
5 {"name":"rose","age":24}
6 ]
7 }

2.在服务器端生成JSON数据
通常,客户端在请求服务器数据时,服务器可以使用XML文档、JSON数据或HTML的形式将数据发送给客户端。
那么如何在服务器端生成JSON数据呢?首先需要完成以下两个准备工作。
(1)我们需要使用MyEclipse创建了一个Web Project,这里我将该工程命名为了“JsonDemoProject”,用来模拟服务器端的Web服务。
(2)我们还需要在该工程中导入JSON的API数据包json-lib-2.2.2-jdk15.jar。
在JSON的API中,提供了JSONObject类,通过调用JSONObject类的put(Object key, Object value)方法,可以将一个Object对象以键值对的形式存入JSONObject对象。通过调用JSONObject类的toString()方法,则可以将JSONObject对象转化为JSON数据。
如下的代码创建了一个JsonTools类,并实现了静态方法createJsonString(),用来生成JSON数据。

1 public class JsonTools {
2
3 /*
4 * Function : 生成JSON数据
5 * Param : key Json数据的键值
6 * object 要生成Json数据的内容
7 * Retuen : JSON数据
8 * Author : 博客园-依旧淡然
9 */
10 public static String createJsonString(String key, Object value) {
11 JSONObject jsonObject = new JSONObject(); //创建一个JSONObject对象
12 jsonObject.put(key, value); //往JSONObject对象中填入内容
13 return jsonObject.toString(); //生成JSON数据并返回
14 }
15
16 }

通过使用该方法,我们可以很方便的将各种数据传递进来,并将其转化成JSON数据。比如,我们可以在JsonService类中,实现一个简单的获取Person对象列表的方法,具体如下:

1 /*
2 * Function : 获取Person对象列表
3 * Author : 博客园-依旧淡然
4 */
5 public List<Person> getListPerson() {
6 List<Person> list = new ArrayList<Person>();
7 Person person1 = new Person(001, "jack", 25);
8 Person person2 = new Person(002, "rose", 24);
9 Person person3 = new Person(003, "bob", 26);
10 list.add(person1);
11 list.add(person2);
12 list.add(person3);
13 return list;
14 }

其中,Person对象具有id(int)、name(String)和age(int)三个属性。
最后,我们可以创建一个继承自HttpServlet的JsonAction类,并实现其中的doPost()方法,用来响应客户端对服务器的请求。具体如下:

1 public void doPost(HttpServletRequest request, HttpServletResponse response)
2 throws ServletException, IOException {
3
4 response.setContentType("text/html;charset=utf-8");
5 request.setCharacterEncoding("utf-8");
6 response.setCharacterEncoding("utf-8");
7 PrintWriter out = response.getWriter();
8
9 List<Person> listPerson = jsonService.getListPerson();
10
11 String str = null;
12 String action_flag = request.getParameter("action_flag"); //获取URL参数
13 if(action_flag.equals("persons")) {
14 str = JsonTools.createJsonString("persons", listPerson);
15 }
16 out.println(str);
17 out.flush();
18 out.close();
19 }

可以看到,在doPost()方法中,我们通过调用getListPerson()方法获得了Person对象列表listPerson,并将其传入JsonTools.createJsonString()方法中,从而获得了一串JSON数据。
将该工程发布到Tomcat上,使用浏览器访问该Web工程,可以看到如图4所示的界面,Person对象列表被成功的转化成了JSON数据。
图4 生成的JSON数据
3.在客户端解析JSON数据
通过上面的步骤,我们已经在服务器上生成了JSON数据。要在我们的Android工程中获取该JSON数据是很容易的,只需要利用Android为我们提供的HttpURLConnection接口访问图4所示的URL即可。
那么,获取到服务器上的JSON数据以后,如何在Android工程中完成对该JSON数据的解析呢?
观察图4所示的JSON数据可以看出:
(1)该JSON数据的最外层是JSONObject,JSONObject的键是“persons”,值是一个JSONArray。
(2)在JSONArray中又包含了3个JSONObject对象。
(3)而在内嵌的每一个JSONObject对象中,都有3个键值对的组合。
分析清楚了JSON数据的构成形式之后,就可以开始着手对其进行解析了。在Android工程中,我们可以创建一个JsonTools类,并实现getListPerson()类方法,用来完成把从服务器获得的Json数据解析出来,还原成Person对象列表。具体代码如下所示:

1 /*
2 * Function : 解析JSON数据,还原成Person对象列表
3 * Param : key Json数据的键值
4 * jsonString 从服务器获得的Json数据
5 * Retuen : Person对象列表
6 * Author : 博客园-依旧淡然
7 */
8 public static List<Person> getListPerson(String key, String jsonString) {
9 List<Person> list = new ArrayList<Person>();
10 try {
11 JSONObject jsonObject = new JSONObject(jsonString); //创建JSONObject对象
12 JSONArray personArray = jsonObject.getJSONArray(key); //获取JSONObject对象的值,该值是一个JSON数组
13 for(int i = 0; i < personArray.length(); i++) {
14 JSONObject personObject = personArray.getJSONObject(i); //获得JSON数组中的每一个JSONObject对象
15 Person person = new Person();
16 int id = personObject.getInt("id"); //获得每一个JSONObject对象中的键所对应的值
17 String name = personObject.getString("name");
18 int age = personObject.getInt("age");
19 person.setId(id); //将解析出来的属性值存入Person对象
20 person.setName(name);
21 person.setAge(age);
22 list.add(person); //将解析出来的每一个Person对象添加到List中
23 }
24 } catch (JSONException e) {
25 e.printStackTrace();
26 }
27 return list;
28 }

在本实例中,点击Button按钮向服务器发送获取JSON数据的请求,从服务器获得JSON数据后,可以使用以上的代码完成对JSON数据的解析,最后将解析得到的Person对象依次显示在TextView控件中。程序运行的结果如图5所示。
转自:链接
JSON数据解析(转)的更多相关文章
- [开源 .NET 跨平台 数据采集 爬虫框架: DotnetSpider] [四] JSON数据解析
[DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 场景模拟 假设由于漏存JD SKU对应的店铺信息.这时我们需要重新完全采集所有 ...
- JSON数据解析 基础知识及链接收集
JSON数据解析学习 JSON介绍 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式. JSON 是存储和交换文本信息的语法.类似 XML.但是JSON 比 ...
- 浅谈JSON数据解析方法
JSON数据解析 JSON是什么?? 如何把JSON数据解析出来 如何把一个字典转换为JSON JSON详细介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交 ...
- JSON数据解析(GSON方式) (转)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 在上一篇博文<Andro ...
- iOS - JSON 数据解析
iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...
- iOS开发笔记3:XML/JSON数据解析
这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...
- Silverlight项目笔记7:xml/json数据解析、TreeView、引用类型与数据绑定错误、图片加载、虚拟目录设置、silverlight安全机制引发的问题、WebClient缓存问题
1.xml/json数据解析 (1)xml数据解析 使用WebClient获取数据,获取到的数据实例化为一个XDocument,使用XDocument的Descendants(XName)方法获得对应 ...
- iOS学习—JSON数据解析
关于在iOS平台上进行JSON解析,已经有很多第三方的开源项目,比如TouchJson,JSONKit,SBJon等,自从iOS5.0以后,苹果SDK推出了自带的JSON解决方案NSJSONSer ...
- Android学习笔记之JSON数据解析
转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...
随机推荐
- ACM/ICPC 之 Bellman Ford练习题(ZOJ1791(POJ1613))
这道题稍复杂一些,需要掌握字符串输入的处理+限制了可以行走的时间. ZOJ1791(POJ1613)-Cave Raider //限制行走时间的最短路 //POJ1613-ZOJ1791 //Time ...
- ACM/ICPC 之 并查集-食物链(POJ1182)
并查集的经典题型,POJ上题目还是中文= =,一般看到中文题都会感觉不太简单,这道题的数学归纳用得比较多,可以简化代码,挺有意思的. 同类型的题目还有POJ1703,比这个要简单,想了解并查集基本介绍 ...
- codeforces 540B.School Marks 解题报告
题目链接:http://codeforces.com/problemset/problem/540/B 题目意思:给出 k 个test的成绩,要凑剩下的 n-k个test的成绩,使得最终的n个test ...
- 51 NOD 1384 全排列(STL 搜索)
1384 全排列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出一个字符串S(可能又重复的字符),按照字典序 ...
- 【hadoop2.6.0】利用Hadoop的 Java API
Hadoop2.6.0的所有Java API都在 http://hadoop.apache.org/docs/r2.6.0/api/overview-summary.html 里. 下面实现一个利用J ...
- 【编程题目】输出 1 到最大的 N 位数
65.输出 1 到最大的 N 位数(运算)题目:输入数字 n,按顺序输出从 1 最大的 n 位 10 进制数.比如输入 3,则输出 1.2.3 一直到最大的 3 位数即 999. 思路:肯定要考虑数字 ...
- UISrollView
1. contentOffset 默认CGPointZero,用来设置scrollView的滚动偏移量. // 设置scrollView的滚动偏移量 scrollView.contentOffset ...
- C++静态代码分析PreFast
1历史 Prefast是微软研究院提出的静态代码分析工具.主要目的是通过分析代码的数据和控制信息来检测程序中的缺陷.需要强调的是,Prefast检测的缺项不仅仅是安全缺陷,但是安全缺陷类型是其检测的最 ...
- 环境搭建及wamp空密码修改
WAMP:快速搭建PHP环境的.Windows系统下.搭建虚拟的服务器环境.APPSERVER:同上. LAMP架构Linux系统Apache服务器管理软件Mysql数据库Php语言. 修改密码方法: ...
- Swift - 2.3的代码到3.0的转变
分享一下学习新语法的技巧:用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcode帮我们把Swift ...