前言

喜欢在前言里讲一下自己的现状,或许能有共鸣的同学,更多的是留给自己一个纪念,几个月或者几年再回来看的时候还是会很有感慨。今天说说语言,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
有两种不同的取值方式:
  1. get():在确定key存在的条件下使用,否则当无法检索到相关key时,将会抛出一个Exception异常信息
  2. 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 urlfinal 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 defaultBufferedReader 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 JSONObjectJSONObject 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 JSONObjectJSONObject oneObject = jsonArray.getJSONObject(i);// To get a specific stringString 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数据解析相关推荐

  1. Android JSON数据解析(GSON方式)

    要创建和解析JSON数据,也可以使用GSON来完成.GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.使用GSON,可以很容易的将一串JSON数据转换为一个Jav ...

  2. Android json数据解析及简单例子

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...

  3. Android学习笔记44:JSON数据解析

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

  4. Android系列---JSON数据解析

    http://www.cnblogs.com/xiaoluo501395377/p/3446605.html Android系列---JSON数据解析 转载于:https://www.cnblogs. ...

  5. json数据解析 android,Android基础之json数据解析

    这次来聊聊Android中json数据的解析,既然是基础就要求只要你看一遍就必须会的,不牵涉到太多的复杂逻辑,目的就是让你初步认识json数据的解析和学会对简单的json数据进行解析. 首先第一步我们 ...

  6. android studio json数据解析汇总(备忘)

    之前写过一个,但是写不太全,结果自己都看不懂,希望这个以后能看懂吧. 以两个例子说明json数据解析,一个是最简单的,一个是比较难的. 必须知道的:JSONObject和JSONArray JSONO ...

  7. Rxjava、Retrofit返回json数据解析异常处理

    每个App都避免不了要进行网络请求,从最开始的用谷歌封装的volley到再到android-async-http再到OKHttpUtils再到现在的Retrofit和RxJava,从我自己用后的体验来 ...

  8. Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示...

    Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家 ...

  9. dio java,Flutter基础(十一)网络请求(Dio)与JSON数据解析

    本文首发于微信公众号「后厂技术官」 前言 在Android开发中如果我们想要请求网络,可以使用HttpClent.HttpURLConnection,但在项目中一般都会使用OkHttp和Retrofi ...

最新文章

  1. Android中实现震动的方法
  2. Linux echo 显示内容颜色
  3. jenkins清除、修改admin主账号的密码
  4. fortran subroutine_Fortran:派生数组与数组传递进子程序耗费时间比较
  5. h5日期选择控件_成都h5开发工程师培训_H5入门需要知道的知识
  6. 【tensorflow】常量张量的初始化
  7. Keras-3 Keras With Otto Group
  8. 设计干货 | 时尚简约海报模板
  9. 【论文笔记】Beyond Low-frequency Information in Graph Convolutional Networks
  10. BIM族库下载——常用Revit结构砌体机械族30套
  11. Qt 中Socket编程实例
  12. ntfs是什么硬盘?ntfs硬盘如何在苹果电脑使用
  13. Vue实战笔记(一) 引入Ant Design
  14. 项目管理PMP:项目绩效考核管理制度(全岗位流程图66页)
  15. Linux 下编译出现“ln failed to create symbolic link operation not supported”
  16. 政务区块链平台设计思路
  17. 详解浅拷贝,深拷贝及实现方法
  18. Python实现PD文字识别、提取并写入CSV文件脚本分享
  19. tsv文件导入mysql
  20. 惊!又一家知名企业被查!

热门文章

  1. Leads、SDR、MQL、SQL、L2C术语概念,线索创建与清洗、线索分级模型、线索流转策略、线索的统计与分析
  2. 微信小程序+UDP+wifi8266+l293d扩展板+Arduino uno遥控小车
  3. 【机器学习自学笔记7】主成分分析(PCA)
  4. DAppStore率先集成ChatGPT助力App安全开发
  5. 如何优雅判断属性值为空
  6. 【C语言刷LeetCode】2126. 摧毁小行星(M)
  7. MATLAB实现正弦频谱分析学习笔记
  8. PhotoShop算法实现高级篇--色彩特效(三十五)
  9. 经纬恒润_软件开发实习生_面试经历(电话面试)
  10. 用 canvas 操作图片像素