探究Android系统中解析JSON数据的方式

 更新时间:2015年07月31日 15:37:20   作者:zinss26914  
这篇文章主要介绍了探究Android系统中解析JSON数据的方式,文中讲到了使用Java代码实现的处理JSON的一些主要方法,需要的朋友可以参考下

前言
喜欢在前言里讲一下自己的现状,或许能有共鸣的同学,更多的是留给自己一个纪念,几个月或者几年再回来看的时候还是会很有感慨。今天说说语言,json这种数据格式之前我做服务器端的时候天天接触,天真的以为json的世界里只有php的json_encode和json_decode,今天当我做客户端的时候,竟然将近一个多小时才搞定json的解析。这里我不是抨击php好坏,只是想说多学点东西,看看你不熟悉的领域,方能开阔自己的视野,方能知道天外有天,方能知道当初你看不上的工作其实你也不一定能很好的完成,扯多了,回来讲解json


什么是json
json(Javascript Object Natation)是一种轻量级的数据交换格式,相比xml这种数据交换格式来说,json相对解析更加简单一些,因此客户端和服务器的数据交换格式往往通过json进行交换

json一共有两种数据结构,一种是以(key/value)对形式存在的无序的jsonObject对象,一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号); “名称/值”对之间使用“,”(逗号)

2015731153703523.png (690×150)

例如:{”name“:"zhengyi.wzy"},这就是一个最简单的json对象,对于这种数据格式,key值必须是String,而value则可以是String,Number,Object,Array等数据类型

2015731153726475.png (691×325)

另一种数据格式就是有序的value的集合,这种形式被称为是jsonArray,数组是值(value)的有序集合。一个数组以”[“(左中括号)开始,”]“(右中括号)结束。值之间使用”,“(逗号)分隔

2015731153747720.png (686×156)

Android中json相关解析类
android的json解析部分都在包org.json下,主要有以下几个类:

JSONObject
这是系统中有关JSON定义的基本单元,其包含一对(key/value)数值

它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{“json”: “Hello, World”},最外被大括号包裹,其中的key和value被冒号”:”分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put(“json”, “Hello, World!”),在key和value之间是以逗号”,”分隔

value的类型包括: JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL

有两种不同的取值方式:

    get():在确定key存在的条件下使用,否则当无法检索到相关key时,将会抛出一个Exception异常信息
    opt():这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认值,并不会抛出异常(个人推荐使用这个方法)


JSONArray
它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[”Alibaba“,”Baidu“,“Tecent”])

这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值

同样JSONArray的value类型可以包括:JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL


Android解析实例
客户端一般从服务器获得都是字符串,直接new一个JSONObject即可,参考程序如下

获取json字符串
这个网址提供了json字符串:http://api.androidhive.info/contacts/, 我们可以开启一个线程发起http请求,获取json字符串,参考代码如下:

  

 private String getJsonByNetwork() { 
    // You can get json by this url 
    final String url = "http://api.androidhive.info/contacts/"; 
    DefaultHttpClient httpClient = new DefaultHttpClient(); 
    HttpGet httpGet = new HttpGet(url); 
   
    InputStream inputStream = null; 
    String result = null; 
   
    try { 
      HttpResponse response = httpClient.execute(httpGet); 
      inputStream = response.getEntity().getContent(); 
   
      // Json is UTF-8 by default 
      BufferedReader reader = new BufferedReader(new InputStreamReader( 
          inputStream, "UTF-8")); 
      StringBuilder sb = new StringBuilder(); 
      String tmp = null; 
   
      while ((tmp = reader.readLine()) != null) { 
        sb.append(tmp); 
      } 
   
      result = sb.toString(); 
    } catch (Exception e) { 
      try { 
        if (inputStream != null) { 
          inputStream.close(); 
        } 
      } catch (IOException se) { 
      } 
    } 
   
    return result; 
  } 

解析json字符串
解析json字符串的步骤一般如下所示:

(1) 创建JSONObject:

  // Create a JSONObject 
  JSONObject jsonObject = new JSONObject(result); 


(2) 获取JSONArray,遍历JSONArray数组

  // To get a specific JSONArray 
  JSONArray jsonArray = jsonObject.getJSONArray("contacts"); 
   
  // To get items from the array 
  for (int i = 0; i < jsonArray.length(); i ++) { 
    // TODO:Traverse the jsonarray 
  } 


(3) 获取JSONObject

  // Create a JSONObject 
  JSONObject jsonObject = new JSONObject(result); 
   
  // To get a specific JSONArray 
  JSONArray jsonArray = jsonObject.getJSONArray("contacts"); 
   
  // To get items from the array 
  for (int i = 0; i < jsonArray.length(); i++) { 
    // To get a specific JSONObject 
    JSONObject oneObject = jsonArray.getJSONObject(i); 
  } 


(4)获取特定字符串

  // Create a JSONObject 
  JSONObject jsonObject = new JSONObject(result); 
   
  // To get a specific JSONArray 
  JSONArray jsonArray = jsonObject.getJSONArray("contacts"); 
   
  // To get items from the array 
  for (int i = 0; i < jsonArray.length(); i++) { 
    // To get a specific JSONObject 
    JSONObject oneObject = jsonArray.getJSONObject(i); 
   
    // To get a specific string 
    String id = oneObject.getString("id"); 
    String name = oneObject.getString("name"); 
   
    Log.e("wzy", "id is:" + id + ", name is " + name); 
  } 


解析结果:

  03-05 10:26:08.690: E/wzy(26401): id is:c200, name is Ravi Tamada 
  03-05 10:26:08.690: E/wzy(26401): id is:c201, name is Johnny Depp 
  03-05 10:26:08.690: E/wzy(26401): id is:c202, name is Leonardo Dicaprio 
  03-05 10:26:08.690: E/wzy(26401): id is:c203, name is John Wayne 
  03-05 10:26:08.691: E/wzy(26401): id is:c204, name is Angelina Jolie 
  03-05 10:26:08.691: E/wzy(26401): id is:c205, name is Dido 
  03-05 10:26:08.691: E/wzy(26401): id is:c206, name is Adele 
  03-05 10:26:08.692: E/wzy(26401): id is:c207, name is Hugh Jackman 
  03-05 10:26:08.693: E/wzy(26401): id is:c208, name is Will Smith 
  03-05 10:26:08.693: E/wzy(26401): id is:c209, name is Clint Eastwood 
  03-05 10:26:08.694: E/wzy(26401): id is:c2010, name is Barack Obama 
  03-05 10:26:08.694: E/wzy(26401): id is:c2011, name is Kate Winslet 
  03-05 10:26:08.695: E/wzy(26401): id is:c2012, name is Eminem 

相关文章

  • springboot应用服务启动事件的监听实现

    springboot应用服务启动事件的监听实现

    本文主要介绍了springboot应用服务启动事件的监听实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • Java在枚举类型中增加自定义方法详解

    Java在枚举类型中增加自定义方法详解

    这篇文章主要介绍了Java在枚举类型中增加自定义方法详解,对于枚举类型来说,除了无法继承它以外,基本可以将它看作一个普通的类,这意味着你可以在里面增加自定义的方法,甚至可以增加一个 main() 方法,需要的朋友可以参考下
    2023-11-11
  • Spring注解驱动之AOP功能测试

    Spring注解驱动之AOP功能测试

    这篇文章主要介绍了Spring注解驱动之AOP功能测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Spring事务失效的几种原因

    Spring事务失效的几种原因

    在日常编码过程中常常涉及到事务,在前两天看到一篇文章提到了Spring事务,那么在此总结下在Spring环境下事务失效的几种原因.
    2020-09-09
  • 学好Java MyBatis拦截器,提高工作效率

    学好Java MyBatis拦截器,提高工作效率

    这篇文章主要介绍了Java中的 MyBatis拦截器,  Mybatis拦截器设计的初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑。详细内容需要的小伙伴可以参考下面文章内容,希望对你有所帮助
    2022-02-02
  • Java判断字符串是不是数字过程解析

    Java判断字符串是不是数字过程解析

    这篇文章主要介绍了Java判断字符串是不是数字过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • JVM如何处理异常深入详解

    JVM如何处理异常深入详解

    异常处理的两大元素:抛出异常、捕获异常,非正常处理的两个方法。下面这篇文章主要给大家介绍了关于JVM如何处理异常的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2019-01-01
  • Java实现经典游戏Flappy Bird的示例代码

    Java实现经典游戏Flappy Bird的示例代码

    Flappy Bird是13年红极一时的小游戏,即摁上键控制鸟的位置穿过管道间的缝隙。本文将用Java语言实现这一经典的游戏,需要的可以参考一下
    2022-02-02
  • spring security在分布式项目下的配置方法(案例详解)

    spring security在分布式项目下的配置方法(案例详解)

    这篇文章主要介绍了spring security在分布式项目下的配置方法,本文通过一个项目案例给大家详细介绍,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Spring MVC框架配置方法详解

    Spring MVC框架配置方法详解

    这篇文章主要为大家详细介绍了Spring MVC框架的配置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04

最新评论