当前位置: 首页 > 编程笔记 >

Android随手笔记44之JSON数据解析

杨君之
2023-03-14
本文向大家介绍Android随手笔记44之JSON数据解析,包括了Android随手笔记44之JSON数据解析的使用技巧和注意事项,需要的朋友参考一下

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式。

  本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析。

1.JSON数据结构

  在JSON中有两种数据结构:对象和数组。

1.1对象

  在JSON中,一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号),冒号后是该名称的值,多个“名称:值”之间使用 “,”(逗号)分隔开来。名称需要使用双引号括起来,值如果是字符串则必须用双引号括起来,如果是数值型则不需要。其结构示意图如图1所示。 


图1 JSON对象结构示意图

  如下的代码是一个简单的JSON对象示例:

   {
   "id":,
   "name":"jack",
   "age":
   }

1.2数组

  在JSON中,数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用 “,”(逗号)分隔开来。其结构示意图如图2所示。

 

图2 JSON数组结构示意图

  如下的代码是一个简单的JSON数组示例:

  ["北京","上海","广州"]

1.3值的类型

  在JSON的对象和数组结构中,value值不仅可以是数字、字符串等简单数据类型,还可以是对象、数组等,如图3所示。


图3 JSON中值的类型

  因此,我们可以使用对象和数组的组合构成复杂的数据结构。如下的代码使用对象结构定义了一个“students”对象,在“students”对象中包含了一个学生数组,而学生数组中的值又是JSON对象。

   {
     "students":
     [
     {"name":"jack","age":},
     {"name":"rose","age":}
     ]
   } 

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数据。

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

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

 /*
    * Function :  获取Person对象列表
    * Author  :  博客园-依旧淡然
    */
   public List<Person> getListPerson() {
     List<Person> list = new ArrayList<Person>();
     Person person = new Person(, "jack", );
     Person person = new Person(, "rose", );
     Person person = new Person(, "bob", );
     list.add(person);
     list.add(person);
     list.add(person);
     return list;
   } 

  其中,Person对象具有id(int)、name(String)和age(int)三个属性。

  最后,我们可以创建一个继承自HttpServlet的JsonAction类,并实现其中的doPost()方法,用来响应客户端对服务器的请求。具体如下:

 public void doPost(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
     response.setContentType("text/html;charset=utf-");
     request.setCharacterEncoding("utf-");
     response.setCharacterEncoding("utf-");
     PrintWriter out = response.getWriter();
     List<Person> listPerson = jsonService.getListPerson();
     String str = null;
     String action_flag = request.getParameter("action_flag");  //获取URL参数
     if(action_flag.equals("persons")) {
       str = JsonTools.createJsonString("persons", listPerson);
     }
     out.println(str);
     out.flush();
     out.close();
   }

  可以看到,在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对象列表。具体

代码如下所示:

  /*
    * Function :  解析JSON数据,还原成Person对象列表
    * Param   :  key      Json数据的键值
    *        jsonString   从服务器获得的Json数据
    * Retuen  :  Person对象列表
    * Author  :  博客园-依旧淡然
    */
   public static List<Person> getListPerson(String key, String jsonString) {
     List<Person> list = new ArrayList<Person>();
     try {
       JSONObject jsonObject = new JSONObject(jsonString);     //创建JSONObject对象
       JSONArray personArray = jsonObject.getJSONArray(key);    //获取JSONObject对象的值,该值是一个JSON数组
       for(int i = ; i < personArray.length(); i++) {
         JSONObject personObject = personArray.getJSONObject(i); //获得JSON数组中的每一个JSONObject对象
         Person person = new Person();
         int id = personObject.getInt("id");           //获得每一个JSONObject对象中的键所对应的值
         String name = personObject.getString("name");
         int age = personObject.getInt("age");
         person.setId(id);    //将解析出来的属性值存入Person对象
         person.setName(name);
         person.setAge(age);
         list.add(person);    //将解析出来的每一个Person对象添加到List中
       }
     } catch (JSONException e) {
       e.printStackTrace();
     }
     return list;
   } 

  在本实例中,点击Button按钮向服务器发送获取JSON数据的请求,从服务器获得JSON数据后,可以使用以上的代码完成对JSON数据的解析,最后将解析得到的Person对象依次显示在TextView控件中。程序运行的结果如图5所示。

图5 运行结果

以上内容是小编给大家分享的Android随手笔记44之JSON数据解析的全部叙述,希望大家喜欢。

 类似资料:
  • 本文向大家介绍Python随手笔记之标准类型内建函数,包括了Python随手笔记之标准类型内建函数的使用技巧和注意事项,需要的朋友参考一下 Python提供了一些内建函数用于基本对象类型:cmp(),repr(),str(),type()和等同于repr()的(' ')操作符 (1)type()    type的用法如下:           type(object)    接受一个对象作为参数,

  • 本文向大家介绍jQuery随手笔记之常用的jQuery操作DOM事件,包括了jQuery随手笔记之常用的jQuery操作DOM事件的使用技巧和注意事项,需要的朋友参考一下  Dom是Document Object Model的缩写,意思是文档对象模型。DOM是一种与浏览器、平台、语言无关的接口,使用该接口可以轻松访问页面中所有的标准组件。 DOM操作可以分为三个方面即DOM Core(核心)、HT

  • 本文向大家介绍Android学习笔记之ContentProvider和Uri详解,包括了Android学习笔记之ContentProvider和Uri详解的使用技巧和注意事项,需要的朋友参考一下 本文介绍了自定义Content Provider的相关内容,完全解析内容提供者的用法。Content Provider,内容提供者,相信大家对这个组件的名字都不陌生,可能是自己平时做的都是一些简单的App

  • 主要内容:本节引言:,1.Json概念以及与XML的比较,2.Android给我们提供的Json解析类,3.代码示例:解析Json字符串:,本节小结:本节引言: 相信大家肯定对 Json 不陌生吧,我们和服务器交互一般用得较多的数据传递方式都是 Json 字符串的形式, 保存对象,我们也可以写成一个 Json 字符串然后存储!解析 Json 不知道你用的是 Gson,Fastjson,jackson 等,不过本节我们并不会去用这些第三方的解析库,而是使用 Android 自带的 Json 解析器

  • 本文向大家介绍Lua学习笔记之数据类型,包括了Lua学习笔记之数据类型的使用技巧和注意事项,需要的朋友参考一下 从本篇博客开始研究一下Lua,现在的Lua真得是很火,因为Cocos2d-x写游戏的时候会用到,所以就拿过来学学吧,先从基础的语法开始,然后慢慢的深入。本人也是刚刚学习,希望和学习Lua的大家交流,博客权当笔记,有错误之处还请赐教。 当然首先是开发环境了,我的学习背景是Cocos2d-x

  • 本文向大家介绍JavaScript 学习笔记之数据类型,包括了JavaScript 学习笔记之数据类型的使用技巧和注意事项,需要的朋友参考一下 一、分类 基本数据类型:undefined、null、string、Boolean、number 复杂数据类型:object object的属性以无序的名称和值对的形式 (name : value) 来定义 二、详解 1、undefined:undefin

  • 本文向大家介绍mysql学习笔记之数据引擎,包括了mysql学习笔记之数据引擎的使用技巧和注意事项,需要的朋友参考一下 查看当前数据库支持的引擎 或者 Engine 引擎的名称 Support 是否支付YES表示支持,NO表示不支持 Comment 评价或者备注 Defalut表示,默认支持的引擎 Transactions 是否支持事务,YES表示支持,NO表示不支持 XA 所有支持的分布式是否符

  • 本文向大家介绍ES6学习笔记之新增数据类型实例解析,包括了ES6学习笔记之新增数据类型实例解析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了ES6学习笔记之新增数据类型。分享给大家供大家参考,具体如下: 1、数据解构赋值 1、数组的解构赋值 基本用法:let  [key1,key2...]=[value1,value2...] 注意左右的key与value格式要匹配对应,键值可以缺省,但