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

什么是jsonjson(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 java json_探究Android系统中解析JSON数据的方式相关推荐

  1. iOS中解析json数据

    同Android中的jsonarray和jsonobject相同,iOS中json分为nsarray和jsonobject, []--------jsonarray/nsarray; {}------ ...

  2. Android实现模拟登陆教务系统并解析网页数据

    前言 时光飞逝,日月如梭,转眼间四年的大学生活已经结束啦!开始了程序员的加班生活.我的第二学位的毕业设计是实现一个学习小助手.这其中最重要的环节就是模拟登录学校的教务系统,获取到教务系统的数据并解析, ...

  3. JAVA 解析JSON数据

    JSON 是目前最流行的轻量级数据交换语言(没有之一).尽管他是javaScript的一个子集.但由于其是独立与语言的文本格式,它几乎可以被所有编程语言所支持. 以下是对java 语言中解析json数 ...

  4. Java解析JSON数据

    Java解析JSON数据 1.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式. 它基于 ECMAScript (欧洲计 ...

  5. java解析json数据_java解析JSON数据详解

    JSON是目前最流行的轻量级数据交换语言(没有之一).尽管他是javaScript的一个子集.但由于其是独立与语言的文本格式,它几乎可以被所有编程语言所支持. 以下是对java语言中解析json数据的 ...

  6. 深入分析jquery解析json数据

    我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. JSON数据如下,是一个嵌套JSON: {"comments":[{& ...

  7. Android中解析JSON形式的数据

    转自:http://shazhuzhu1.iteye.com/blog/974758 1.JSON(JavaScript Object Notation) 定义: 一种轻量级的数据交换格式,具有良好的 ...

  8. 1.Android中解析json程序代码

    Android程序解析json数据可以通过gson的方式,这种情况需要导入相应的jar包.测试代码如下: @Override protected void onCreate(Bundle savedI ...

  9. java+解析未知json_在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例...

    java+解析未知json 使用Jackson API在Java中解析JSON时的常见问题之一是,当您的JSON包含未知属性(即您的Java类没有对应于所有JSON属性的所有字段)时,该操作将失败. ...

最新文章

  1. Python中从cmd获得.py文件的参数
  2. java 快排非递归_C++ 中快排的递归和非递归实现
  3. 从AppDomain迁移到AssemblyLoadContext
  4. Silverlight实用窍门系列:28.Silverlight制作随机分布雷达扫描点,模拟雷达扫描图之被扫描设备【附带源码实例】...
  5. linux目录结构及作用详图
  6. 输入挂(bzoj 2901: 矩阵求和)
  7. 【算法工程师】华为技术面面试记录
  8. 云端: 小软件大平台,绿色又安全 V0.9 Beta3(090722)
  9. 中国有34个省市自治区(342个市)
  10. Bot Chat(聊天机器人) AdaptiveCard的用法(源码)
  11. 扫雷php,扫雷php
  12. vue多次引用组件,减少每个页面import的方法
  13. 07 linux 一个完整的shell脚本调试工具
  14. 强制重启计算机快捷键,强制重启电脑快捷键
  15. 小学计算机ps课题计划,小学生学习习惯养成课题总结
  16. android 刷机后存储空间变小,手机存储容量与标称不符 剩余的空间跑哪了?
  17. 腾讯云技术公开课:公有云架构演进之路
  18. 基础篇——树莓派添加一键锁屏
  19. Qt自己编写keyboad虚拟键盘
  20. spring boot视频-网易云课堂视频目录

热门文章

  1. Android Studio快捷键记录
  2. 验证 %java_home%_报错:JAVA_HOME cannot be determined from the Registry的解决
  3. Photoshop中PNG转TGA的方法
  4. Docker与自动化部署
  5. 通达信接口测速器的分类
  6. 【笔记】《计算机网络系统方法》(by Larry L.Peterson)第二章 开始连接
  7. 提权-win烂土豆dll劫持引号路径服务权限
  8. Python调试器-Pdb的简介及调试命令
  9. Rubber Translator一款更人性化的免费文献翻译工具,支持多翻译引擎
  10. 1935 error