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

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

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

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

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

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
json
ios系统json解析、ios 系统自带json解析、android json解析、android解析json数据、android json解析框架,以便于您获取更多的相关知识。

时间: 2024-11-03 18:38:24

探究Android系统中解析JSON数据的方式_java的相关文章

在Android系统中解析XML文件的方法_java

前言    在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码.因此,这里也顺道介绍一下XmlPullParser的使用. XML    XML(eXtensible Markup Language)中文名为可扩展标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等.用途    XML设计用了传送及携带数据信息,不用了表现或展示数据,HTML语言则用了表现数据,所以XML用途的焦点是

Android使用OKHTTP解析JSON数据的实例代码

为了代码重用,我们首先封装一个类.这个类是HttpUtil HttpUtil.java package com.example.asus.networktest; import okhttp3.OkHttpClient; import okhttp3.Request; public class HttpUtil { public static void sendOkHttpRequest(final String address, final okhttp3.Callback callback)

深入分析jquery解析json数据_jquery

我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. JSON数据如下,是一个嵌套JSON: 复制代码 代码如下: {"comments":[{"content":"很不错嘛","id":1,"nickname":"纳尼"},{"content":"哟西哟西","id":2

jquery getJSON()解析JSON数据(跨域)

getJSON()这个就是我今天要讲的jquery操作json数据的函数 jQuery.getJSON( url, [data,] [success(data, textStatus, jqXHR)] ) urlA string containing the URL to which the request is sent. dataA map or string that is sent to the server with the request. success(data, textSta

我的Android进阶之旅------&amp;gt;解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题

1.问题描述 首先,需要解析的Json数据类似于下面的格式,但是包含了Java关键字abstract: { ret: 0, msg: "normal return.", news: [ { id: "NEW2016062800875700", from: "腾讯新闻客户端", qqnews_download_url: "http://inews.qq.com/m?refer=openapi_for_xiaotiancai",

Android中使用Gson解析JSON数据的两种方法_Android

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海". 第三种类型是映射(mapping),也就是一个名/值对(

Android中使用Gson解析JSON数据的两种方法

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组(array)或列表(List),比如"北京,上海". 第三种类型是映射(mapping),也就是一个名/值对(

Android 中对JSON数据解析实例代码

Android 中对JSON数据解析 在Android的网络编程中,JSON是比XML使用更为广泛的数据传输机制.在许多的http网络请求或接口调用中,返回的很多都是JSON.所以学会解析JSON是学会Android的基本技能. 简单介绍下JSON,JSON是轻量级的文本数据交换格式,独立于语言和平台.比XML更小,更快,更易解析.JSON是用键值对来保存数据的.JSON保存的值可以是数字.字符串.布尔值.数组和对象. 废话少说,直接上代码.下面对以下JOSN进行解析: { "language&

Android中的JSONObject和JSONArray解析json数据

       String strJson = "{"students":[{"name":"Jack","age":12}, {"name":"Vista","age":23}, {"name":"Kaka","age":22}, {"name":"Hony"