Android学习笔记44: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所示。


图5 运行结果

转载于:https://www.cnblogs.com/menlsh/archive/2013/05/14/3078948.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[GAN学习系列2] GAN的起源

本文大约 5000 字&#xff0c;阅读大约需要 10 分钟 这是 GAN 学习系列的第二篇文章&#xff0c;这篇文章将开始介绍 GAN 的起源之作&#xff0c;鼻祖&#xff0c;也就是 Ian Goodfellow 在 2014 年发表在 ICLR 的论文–Generative Adversarial Networks”&#xff0c;当然由于…

两条路,此人如何问甲乙问题?才能走向京城

描述&#xff1a; 有甲、乙两人&#xff0c;其中&#xff0c;甲只说假话&#xff0c;而不说真话&#xff1b;乙则是只说真话&#xff0c;不说假话。但是&#xff0c;他们两个人在回答别人的问题时&#xff0c;只通过点头与摇头来表示&#xff0c;不讲话。有一天&#xff0c;一个…

[资源分享] Github上八千Star的深度学习500问教程

本文大约 600 字&#xff0c;阅读大约需要 2 分钟这周要分享的一个资源是来自 Github 上的已经有八千多 Star 的一个深度学习知识总结&#xff0c;如下图所示&#xff1a;其 Github 地址为&#xff1a;https://github.com/scutan90/DeepLearning-500-questions它目前是有 16 个…

获取android系统手机的铃声和音量

获取android系统手机的铃声和音量 通过程序 获取android系统手机的铃声和音量。设置音量的方法也很简单&#xff0c;AudioManager提供了方法&#xff1a; publicvoidsetStreamVolume(intstreamType,intIndex,intFlags)其中streamType有内置的常量&#xff0c;去文档里面就可以…

linux的xmgrace无法运行,科学网—安装xmgrace - 林绪波的博文

安装xmgrace如果不接触GROMACS我不会知道有一个类似于origin的LINUX下作图的软件――xmgrace下载地址(可自行搜索)http://plasma-gate.weizmann.ac.il/Grace/安装过程&#xff1a;# tar xvzf grace-5.1.20.tar.gz# cd grace-5.1.20.# ./configure# make# make install以上的解压…

谷歌开源的 GAN 库--TFGAN

本文大约 8000 字&#xff0c;阅读大约需要 12 分钟 第一次翻译&#xff0c;限于英语水平&#xff0c;可能不少地方翻译不准确&#xff0c;请见谅&#xff01; 最近谷歌开源了一个基于 TensorFlow 的库–TFGAN&#xff0c;方便开发者快速上手 GAN 的训练&#xff0c;其 Github …

h3c交换机配置文件的导出

首先要知道一个命令 就是进入 系统视图 system-view 然后 dir 查看 交换机 flash里的所有文件。 一、使用TFTP方式 步骤1、在PC机“开始菜单”的“运行”栏中键入“cmd”&#xff0c;进入DOS界面&#xff0c;保证PC机可以PING通设备。 步骤2、在PC机上安装TFTP服务器端软…

linux快速php,Linux 下的这些高效指令,是你快速学习的神器

linux是一套免费使用和自由传播的类unix操作系统&#xff0c;是一个基于posix和unix的多用户、多任务、支持多线程和多cpu的操作系统。它能运行主要的unix工具软件、应用程序和网络协议。它支持32位和64位硬件。linux继承了unix以网络为核心的设计思想&#xff0c;是一个性能稳…

TensorFlow 加载多个模型的方法

采用 TensorFlow 的时候&#xff0c;有时候我们需要加载的不止是一个模型&#xff0c;那么如何加载多个模型呢&#xff1f; 原文&#xff1a;https://bretahajek.com/2017/04/importing-multiple-tensorflow-models-graphs/ 关于 TensorFlow 可以有很多东西可以说。但这次我只…

面试题整理(答案从网上找到后整理的)

1、 java中如何把String型转化成double型的 String s "123.345"; double num Double.parseDouble(s); 当string里的数字比较大时&#xff1a; 例如&#xff1a; 字符串“1467000000”通过Double.parseDouble以后转化为double类型&#xff0c;然后我用它除以1000000…

linux gst-launch 播放视频旋转,【视频开发】Gstreamer中一些gst-launch常用命令

GStreamer是著名的开源多媒体框架&#xff0c;功能强大&#xff0c;其命令行程序 gst-launch 可以实现很多常规测试、播放等&#xff0c;作为系统调试等是非常方便的。1、摄像头测试gst-launch v4l2src ! xvimagesinkgst-launch v4l2src ! video/x-raw-yuv,width320,height240,…

[资源分享] TensorFlow 官方中文版教程来了

最近&#xff0c;TensorFlow 提供了中文版的教程&#xff08;Tutorials&#xff09;和指南&#xff08;Guide&#xff09;。其中&#xff0c;教程是介绍了一些基本的机器学习模型&#xff0c;包括分类、回归等&#xff0c;也包括一些深度学习方面的模型&#xff0c;包括常用的卷…

深度学习4线性回归,逻辑回归

y是连续的则是一个回归问题&#xff0c;y是离散的则是一个分类问题&#xff0c;这边就开始考虑y是离散的情况。 对于这样的问题很多&#xff0c;比如判断一个人是否生病&#xff0c;或者判断一个邮件是否是垃圾邮件。 回归时连续型的&#xff0c;一般不用在上述的分类问题中&am…

linux系统shell知识点,Linux 系统中shell知识点说明和常用的帮助命令简单介绍 | IT工程师的生活足迹...

linux 系统内核和各种驱动程序覆盖在下层的硬件系统之上&#xff1b;对上提供各种系统调用接口API&#xff0c;供shell和各种程序应用程序调用。总体结构图如下&#xff1a;操作系统的层次架构一般我们理解shell指的是BASH,即linux系统默认的字符界面使用的shell版本。另外还有…