眼下解析json有三种工具:org.json(Java经常使用的解析),fastjson(阿里巴巴project师开发的)。Gson(Google官网出的)。解析速度最快的是Gson,下载地址:https://code.google.com/p/google-gson/

什么是JSON:


JSON即JavaScript Object Natation, 它是一种轻量级的数据交换格式, 与XML一样, 是广泛被採用的client和服务端交互的解决方式.

JSON对象: 


JSON中对象(Object)以"{"開始, 以"}"结束. 对象中的每个item都是一个key-value对, 表现为"key:value"的形式, key-value对之间使用逗号分隔. 如:{"name":"coolxing", "age"=24, "male":true, "address":{"street":"huiLongGuan", "city":"beijing", "country":"china"}}. JSON对象的key仅仅能是string类型的, 而value能够是string, number, false, true, null, Object对象甚至是array数组, 也就是说能够存在嵌套的情况.

JSON数组: 


JSON数组(array)以"["開始, 以"]"结束, 数组中的每个元素能够是string, number, false, true, null, Object对象甚至是array数组, 数组间的元素使用逗号分隔. 如["coolxing", 24, {"street":"huiLongGuan", "city":"beijing", "country":"china"}].

Gson的基本用法:

通过获取JsonReader对象解析JSON数据:

  1. String jsonData = "[{\"username\":\"arthinking\",\"userId\":001},{\"username\":\"Jason\",\"userId\":002}]";
  2. try{
  3. JsonReader reader = new JsonReader(new StringReader(jsonData));
  4. reader.beginArray();
  5. while(reader.hasNext()){
  6. reader.beginObject();
  7. while(reader.hasNext()){
  8. String tagName = reader.nextName();
  9. if(tagName.equals("username")){
  10. System.out.println(reader.nextString());
  11. }
  12. else if(tagName.equals("userId")){
  13. System.out.println(reader.nextString());
  14. }
  15. }
  16. reader.endObject();
  17. }
  18. reader.endArray();
  19. }
  20. catch(Exception e){
  21. e.printStackTrace();
  22. }
  1.  

通过把JSON数据映射成一个对象,使用Gson对象的fromJson()方法获取一个对象数组进行操作:

创建JSON数据相应的一个POJO对象User.java:

  1. public class User {
  2. private String username ;
  3. private int userId ;
  4. public String getUsername() {
  5. return username;
  6. }
  7. public void setUsername(String username) {
  8. this.username = username;
  9. }
  10. public int getUserId() {
  11. return userId;
  12. }
  13. public void setUserId(int userId) {
  14. this.userId = userId;
  15. }
  16. }

使用Gson对象获取User对象数据进行相应的操作:

  1. Type listType = new TypeToken<LinkedList<User>>(){}.getType();
  2. Gson gson = new Gson();
  3. LinkedList<User> users = gson.fromJson(jsonData, listType);
  4. for (Iterator iterator = users.iterator(); iterator.hasNext();) {
  5. User user = (User) iterator.next();
  6. System.out.println(user.getUsername());
  7. System.out.println(user.getUserId());
  8. }

假设要处理的JSON字符串仅仅包括一个JSON对象。则能够直接使用fromJson获取一个User对象:

  1. String jsonData = "{\"username\":\"arthinking\",\"userId\":001}";
  2. Gson gson = new Gson();
  3. User user = gson.fromJson(jsonData, User.class);
  4. System.out.println(user.getUsername());
  5. System.out.println(user.getUserId());

解析复杂实例:

数据格式:

  1. {
  2. "data": {
  3. "partnerteamlist": [
  4. {
  5. "pteamId": 72825,
  6. "ptitle": "随摄影/共6套服装/准爸准妈共拍/免费肚画/底片全送。
  7.  
  8. ",
  9. "pteamprice": 288
  10. },
  11. {
  12. "pteamId": 72598,
  13. "ptitle": "随摄影/拍摄200张/4本相冊/品质拍摄/送全新婚纱。",
  14. "pteamprice": 2888
  15. },
  16. {
  17. "pteamId": 72613,
  18. "ptitle": "随摄影/送全新婚纱/多外景拍摄/服装不限数量/绝无二次消费。",
  19. "pteamprice": 3699
  20. },
  21. {
  22. "pteamId": 72638,
  23. "ptitle": "随摄影/服装不限数量/高品质拍摄260张/送全新婚纱。",
  24. "pteamprice": 4299
  25. },
  26. {
  27. "pteamId": 72716,
  28. "ptitle": "随摄影/3组服装造型/内外景拍摄/全然透明消费!
  29.  
  30. ",
  31. "pteamprice": 388
  32. }
  33. ],
  34. "liketeamlist": [
  35. {
  36. "lteamId": 65886,
  37. "ltitle": "爱丽尔婚纱摄影/2本相冊/6套服装造型/拍摄不限最低拍摄150张。",
  38. "limage": "http://img.pztuan.com/upfile/team/2013/0712/201307120257551465.jpg",
  39. "lteamprice": 518,
  40. "lmarketprice": 3999
  41. },
  42. {
  43. "lteamId": 57133,
  44. "ltitle": "陶冶摄影/婚纱闺蜜/6组服装造型/拍摄不低于120张。",
  45. "limage": "http://img.pztuan.com/upfile/team/2013/0628/201306281115249737.jpg",
  46. "lteamprice": 580,
  47. "lmarketprice": 3380
  48. }
  49. ],
  50. "feedbacks": {
  51. "feedbacklist": [
  52. {
  53. "comment": "5分",
  54. "createtime": "2014.07.08 13:38",
  55. "score": 5,
  56. "username": "l***2"
  57. }
  58. ],
  59. "totalcount": 1,
  60. "totalscore": 5
  61. }
  62. },
  63. "err": null,
  64. "state": 1
  65. }

实体类(里面的成员变量和接口的返回值名称一 一相应才干保证解析正确):

  1. package com.pztuan.entity;
  2.  
  3. import java.util.List;
  4.  
  5. public class OtherDetail {
  6.  
  7. private int state;
  8. private List<err> err;
  9. private OtherDetail2 data;
  10.  
  11. public int getState() {
  12. return state;
  13. }
  14.  
  15. public void setState(int state) {
  16. this.state = state;
  17. }
  18.  
  19. public List<err> getErr() {
  20. return err;
  21. }
  22.  
  23. public void setErr(List<err> err) {
  24. this.err = err;
  25. }
  26.  
  27. public OtherDetail2 getData() {
  28. return data;
  29. }
  30.  
  31. public void setData(OtherDetail2 data) {
  32. this.data = data;
  33. }
  34.  
  35. public class OtherDetail2 {
  36. private List<partnerteamlist> partnerteamlist;
  37. private List<liketeamlist> liketeamlist;
  38. private List<feedbacks> feedbacks;
  39.  
  40. public List<liketeamlist> getLiketeamlist() {
  41. return liketeamlist;
  42. }
  43.  
  44. public void setLiketeamlist(List<liketeamlist> liketeamlist) {
  45. this.liketeamlist = liketeamlist;
  46. }
  47.  
  48. public List<feedbacks> getFeedbacks() {
  49. return feedbacks;
  50. }
  51.  
  52. public void setFeedbacks(List<feedbacks> feedbacks) {
  53. this.feedbacks = feedbacks;
  54. }
  55.  
  56. public class partnerteamlist {
  57. private int pteamId;
  58. private String ptitle;
  59. private Double pteamprice;
  60.  
  61. public int getPteamId() {
  62. return pteamId;
  63. }
  64.  
  65. public void setPteamId(int pteamId) {
  66. this.pteamId = pteamId;
  67. }
  68.  
  69. public String getPtitle() {
  70. return ptitle;
  71. }
  72.  
  73. public void setPtitle(String ptitle) {
  74. this.ptitle = ptitle;
  75. }
  76.  
  77. public Double getPteamprice() {
  78. return pteamprice;
  79. }
  80.  
  81. public void setPteamprice(Double pteamprice) {
  82. this.pteamprice = pteamprice;
  83. }
  84.  
  85. }
  86.  
  87. public class liketeamlist {
  88. private int lteamId;
  89. private String ltitle;
  90. private String limage;
  91. private Double lteamprice;
  92. private Double lmarketprice;
  93.  
  94. public int getLteamId() {
  95. return lteamId;
  96. }
  97.  
  98. public void setLteamId(int lteamId) {
  99. this.lteamId = lteamId;
  100. }
  101.  
  102. public String getLtitle() {
  103. return ltitle;
  104. }
  105.  
  106. public void setLtitle(String ltitle) {
  107. this.ltitle = ltitle;
  108. }
  109.  
  110. public String getLimage() {
  111. return limage;
  112. }
  113.  
  114. public void setLimage(String limage) {
  115. this.limage = limage;
  116. }
  117.  
  118. public Double getLteamprice() {
  119. return lteamprice;
  120. }
  121.  
  122. public void setLteamprice(Double lteamprice) {
  123. this.lteamprice = lteamprice;
  124. }
  125.  
  126. public Double getLmarketprice() {
  127. return lmarketprice;
  128. }
  129.  
  130. public void setLmarketprice(Double lmarketprice) {
  131. this.lmarketprice = lmarketprice;
  132. }
  133. }
  134.  
  135. public class feedbacks {
  136. private int totalcount;
  137. private Double totalscore;
  138. private List<feedbacklist> feedbacklist;
  139.  
  140. public int getTotalcount() {
  141. return totalcount;
  142. }
  143.  
  144. public void setTotalcount(int totalcount) {
  145. this.totalcount = totalcount;
  146. }
  147.  
  148. public Double getTotalscore() {
  149. return totalscore;
  150. }
  151.  
  152. public void setTotalscore(Double totalscore) {
  153. this.totalscore = totalscore;
  154. }
  155.  
  156. public List<feedbacklist> getFeedbacklist() {
  157. return feedbacklist;
  158. }
  159.  
  160. public void setFeedbacklist(List<feedbacklist> feedbacklist) {
  161. this.feedbacklist = feedbacklist;
  162. }
  163.  
  164. public class feedbacklist {
  165. private String username;
  166. private String comment;
  167. private String createtime;
  168. private Double score;
  169.  
  170. public String getUsername() {
  171. return username;
  172. }
  173.  
  174. public void setUsername(String username) {
  175. this.username = username;
  176. }
  177.  
  178. public String getComment() {
  179. return comment;
  180. }
  181.  
  182. public void setComment(String comment) {
  183. this.comment = comment;
  184. }
  185.  
  186. public String getCreatetime() {
  187. return createtime;
  188. }
  189.  
  190. public void setCreatetime(String createtime) {
  191. this.createtime = createtime;
  192. }
  193.  
  194. public Double getScore() {
  195. return score;
  196. }
  197.  
  198. public void setScore(Double score) {
  199. this.score = score;
  200. }
  201.  
  202. }
  203. }
  204.  
  205. public List<partnerteamlist> getPartnerteamlist() {
  206. return partnerteamlist;
  207. }
  208.  
  209. public void setPartnerteamlist(List<partnerteamlist> partnerteamlist) {
  210. this.partnerteamlist = partnerteamlist;
  211. }
  212. }
  213.  
  214. public class err {
  215. private int code;
  216. private String msg;
  217.  
  218. public int getCode() {
  219. return code;
  220. }
  221.  
  222. public void setCode(int code) {
  223. this.code = code;
  224. }
  225.  
  226. public String getMsg() {
  227. return msg;
  228. }
  229.  
  230. public void setMsg(String msg) {
  231. this.msg = msg;
  232. }
  233. }
  234. }

注意上面内部类的运用。

解析:

  1. Gson gson = new Gson();
  2. OtherDetail d = gson.fromJson(jsonString,Detail.class);//取值的时候就从父类一层一层调子类成员(重要)

若出现引用异常,请查看Java内部类设计原则。

如有问题请留言,转载注明出处。

參考:http://www.itzhai.com/android-to-parse-json-data-using-gson.html

http://blog.csdn.net/caijunjun1006/article/details/11762841

Android Gson深入分析的更多相关文章

  1. 【转】Android Gson的使用

    Android Gson 2014 年 05 月 22 日 android 目前的客户端大都有和服务端进行交互,而数据的格式基本就是json了,于是在Android开发中就经常用到json解析,方便的 ...

  2. 《Android开发艺术探索》读书笔记 (7) 第7章 Android动画深入分析

    本节和<Android群英传>中的第七章Android动画机制与使用技巧有关系,建议先阅读该章的总结 第7章 Android动画深入分析 7.1 View动画 (1)android动画分为 ...

  3. Android Gson的使用总结

    1.概念 Gson是谷歌发布的一个json解析框架 2.如何获取 github:https://github.com/google/gson android studio使用 compile 'com ...

  4. Android Gson 操作

    JSON序列化后的数据不带类名与名命空间,所以这两个服务端跟客户端可以不对应,需要保证字段对应即可 Asp.net MVC端 using System; using System.Collection ...

  5. Android Gson解析

    目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:https://co ...

  6. Android Gson使用笔记

    最近在做一个java web service项目,需要用到jason,本人对java不是特别精通,于是开始搜索一些java平台的json类库. 发现了google的gson,因为之前对于protoco ...

  7. Android 动画深入分析

    一些娱乐动画安德鲁斯被广泛使用应用上述的.在不牺牲性能,它可以带来非常好的体验,下面会解释具体的实现安卓动画.知识的学校一个明确清晰的白色. 动画类型 Android的animation由四种类型组成 ...

  8. Android动画深入分析

    动画分类 Android动画可以分3种:View动画,帧动画和属性动画:属性动画为API11的新特性,在低版本是无法直接使用属性动画的,但可以用nineoldAndroids来实现(但是本质还是vii ...

  9. Android Gson解析json详解

    目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),解析速度最快的是Gson,下载地址:https://co ...

随机推荐

  1. C语言入门(19)——C语言的编码风格

    代码风格好不好就像字写得好不好看一样,如果一个公司招聘秘书,肯定不要字写得难看的,同理,代码风格糟糕的程序员肯定也是不称职的.虽然编译器不会挑剔难看的代码,照样能编译通过,但是和你一个团队进行协作的其 ...

  2. Java实现验证码图片

    这样的实现方式对JDK版本有要求. 1 package edu.cloud.editmap.utils; import java.awt.Color; import java.awt.Font; im ...

  3. matlab 矩阵

    假设矩阵A=[1 3;4 2] 1.对角置零: A-diag(diag(A)) 2.求A的特征值以及特征向量: 用到eig(A)函数,此函数有五种用法,如下: 2.1 E=eig(A):求矩阵A的全部 ...

  4. 【转】使用Navicat for Oracle新建表空间、用户及权限赋予

    首先.我们来新建一个表空间.打开Navicat for Oracle,输入相关的的连接信息.如下图: 填入正确的信息,连接后.我们点击面板上的“其他”下的选项“表空间”,如下图: 进入表空间的界面,我 ...

  5. CRM后期修改实体,新增货币类型字段 需要注意的问题

    货币类型字段新增 需要处理历史数据 否则编辑会报错 提示如果货币字段中存在值,则需要指定币种,请选择币种,然后重试 编辑时货币字段不显示¥符号.新增正常.第一次编辑提示错误保存后再编辑也正常.不是JS ...

  6. 创建ORACLE 查询用户

    [apptest@vis appl]$ su -oravis [oravis@vis 11.1.0]$ sqlplus / as sysdba SQL> create user erpquery ...

  7. PHP正则提取HTML中img的url值

    <html> <head> <title>获取HTML中的img的src值</title> </head> <body> < ...

  8. Mysql表锁定解决

    #查看进程SELECT *FROM information_schema.processlistWHERE USER = 'root' AND state LIKE 'Waiting%';#杀掉进程K ...

  9. 鼠标经过图片时变换的两种方法--css+div及javascript应用

    javascript方式:    熟悉使用document.getElementById()取得节点对象 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTM ...

  10. web前端-html学习笔记

    学习html最重要的是坚持.细心.多动手.慕课网<HTML+CSS基础课程>的笔记. 1.<h1>网站标题</h1> 如:<h1>腾讯网</h1& ...