本文共 4859 字,大约阅读时间需要 16 分钟。
原文地址:http://blog.isming.me/2014/06/04/parse-json-in-android/
http://gaosililin.iteye.com/blog/2245666
android中网络数据传输是经常被用到的,通常我们使用xml或者json,而json更加轻量,便捷,我们使用的更多。我自己在项目中使用很多,今天就说说android中怎么去解析JSON,帮助自己总结内容,同时帮助别人少走弯路。
##JSON语法
首先看JSON的语法和结构,这样我们才知道怎么去解析它。JSON语法时JavaScript对象表示语法的子集。JSON的值可以是:
-
数字(整数或者浮点数)
-
字符串(在双引号内)
-
逻辑值(true 或 false)
-
数组(使用方括号[]包围)
-
对象( 使用花括号{}包围)
-
null
JSON中有且只有两种结构:对象和数组。
1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 [“java”,”javascript”,”vb”,…],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。##andoroid解析JSON
android sdk中为我们提供了org.json,可以用来解析json,在android3.0又为在android.util包JsonReader和JsonWriter来进行json的解析和生成。####使用org.json包JSONObject和JSONArray进行解析
我们知道json中就两种结构array和object,因此就有这个两个类进行解析。如我们有下面几个json字符串:
1 2 3 | { "name": "sam", "age": 18, "weight": 60} //json1 一个json对象 [ 12, 13, 15] //json2 一个数字数组 [{ "name": "sam", "age": 18},{ "name": "leo", "age": 19},{ "name": "sky", "age": 20}] //json3 json array中有object |
第一个json对象json1的解析
1 2 3 4 | JSONObject jsonObj = new JSONObject(json1); String name = jsonObj.optString( "name"); int age = jsonObj.optInt( "age"); int weight = jsonObj.optInt( "weight"); |
再来看解析数组,简单的数组。第二个json2
1 2 3 4 | JSONArray jsonArray = new JSONArray(json2); for ( int = 0; i < jsonArray.length();i++) { int age = jsonArray.optInt(i); } |
解析复杂数组,包含对象,json3
1 2 3 4 5 6 | JSONArray jsonArray = new JSONArray(json3); for ( int = 0; i < jsonArray.length();i++) { JSONObject jsonObject = jsonArray.optJSONObject(i); String name = jsonObject.optString( "name"); int age = jsonObject.optInt( "age"); } |
从上面可以看到数组的话解析方法和对象差不多,只是将键值替换为在数组中的下标。另外也是有optXXX(int index)和getXXX(int index)方法的,opt也是安全的,即对应index无值的时候,不会报错,返回空,推荐使用。
##使用GSON解析JSON
GSON是谷歌出品,很好用。同时呢还有一些其他的第三方的比如fastjson等,都和Gson差不多,传一个string和要转换的对象,帮你直接直接解析出来,不再需要我们自己一个字段一段字段的解析。这里就以Gson为例吧,因为我只用过Gson,对其最熟悉。^_^
使用Gson,我们需要导入Gson的包,下载地址。
现在开始看看,怎么解析上面的三个json字符串例子。
第一个对象json1
首先我们需要一个实体类
1 2 3 4 5 6 7 8 9 | public class People{ public String name; @SerializedName(age) pubic int mAge; //如果我们类中成员的名称和json对象中的键名不同,可以通过注解来设置名字 public int weight; } |
然后就可以解析了
1 2 | Gson gson = new Gson(); Poeple people = gson.fromJson(json1, People.class); |
对于第二个json2,我们可以解析成int数组,也可以解析成Integer的List。
解析成数组: 1 2 | Gson gson = new Gson(); int[] ages = gson.fromJson(json2, int[].class); |
解析成List:
1 2 | Gson gson = new Gson(); List |
第三个同样可以解析成List或者数组,我们就直接解析成List.
1 2 | Gson gson = new Gson(); List |
从上面的代码看到,使用Gson解析的话就非常简单了。需要注意的是如果对应的键值和成员名称不同的话可以使用注解来标记。
转载地址:https://blog.csdn.net/happy_love1990/article/details/70231524 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!