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

什么是JSON:

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

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. }

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

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

  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. }
  1. public class OtherDetail2 {
  2. private List<partnerteamlist> partnerteamlist;
  3. private List<liketeamlist> liketeamlist;
  4. private List<feedbacks> feedbacks;
  5.  
  6. public List<liketeamlist> getLiketeamlist() {
  7. return liketeamlist;
  8. }
  9.  
  10. public void setLiketeamlist(List<liketeamlist> liketeamlist) {
  11. this.liketeamlist = liketeamlist;
  12. }
  13.  
  14. public List<feedbacks> getFeedbacks() {
  15. return feedbacks;
  16. }
  17.  
  18. public void setFeedbacks(List<feedbacks> feedbacks) {
  19. this.feedbacks = feedbacks;
  20. }
  1. public class partnerteamlist {
  2. private int pteamId;
  3. private String ptitle;
  4. private Double pteamprice;
  5.  
  6. public int getPteamId() {
  7. return pteamId;
  8. }
  9.  
  10. public void setPteamId(int pteamId) {
  11. this.pteamId = pteamId;
  12. }
  13.  
  14. public String getPtitle() {
  15. return ptitle;
  16. }
  17.  
  18. public void setPtitle(String ptitle) {
  19. this.ptitle = ptitle;
  20. }
  21.  
  22. public Double getPteamprice() {
  23. return pteamprice;
  24. }
  25.  
  26. public void setPteamprice(Double pteamprice) {
  27. this.pteamprice = pteamprice;
  28. }
  29.  
  30. }
  1. public class liketeamlist {
  2. private int lteamId;
  3. private String ltitle;
  4. private String limage;
  5. private Double lteamprice;
  6. private Double lmarketprice;
  7.  
  8. public int getLteamId() {
  9. return lteamId;
  10. }
  11.  
  12. public void setLteamId(int lteamId) {
  13. this.lteamId = lteamId;
  14. }
  15.  
  16. public String getLtitle() {
  17. return ltitle;
  18. }
  19.  
  20. public void setLtitle(String ltitle) {
  21. this.ltitle = ltitle;
  22. }
  23.  
  24. public String getLimage() {
  25. return limage;
  26. }
  27.  
  28. public void setLimage(String limage) {
  29. this.limage = limage;
  30. }
  31.  
  32. public Double getLteamprice() {
  33. return lteamprice;
  34. }
  35.  
  36. public void setLteamprice(Double lteamprice) {
  37. this.lteamprice = lteamprice;
  38. }
  39.  
  40. public Double getLmarketprice() {
  41. return lmarketprice;
  42. }
  43.  
  44. public void setLmarketprice(Double lmarketprice) {
  45. this.lmarketprice = lmarketprice;
  46. }
  47. }
  1. public class feedbacks {
  2. private int totalcount;
  3. private Double totalscore;
  4. private List<feedbacklist> feedbacklist;
  5.  
  6. public int getTotalcount() {
  7. return totalcount;
  8. }
  9.  
  10. public void setTotalcount(int totalcount) {
  11. this.totalcount = totalcount;
  12. }
  13.  
  14. public Double getTotalscore() {
  15. return totalscore;
  16. }
  17.  
  18. public void setTotalscore(Double totalscore) {
  19. this.totalscore = totalscore;
  20. }
  21.  
  22. public List<feedbacklist> getFeedbacklist() {
  23. return feedbacklist;
  24. }
  25.  
  26. public void setFeedbacklist(List<feedbacklist> feedbacklist) {
  27. this.feedbacklist = feedbacklist;
  28. }
  1. public class feedbacklist {
  2. private String username;
  3. private String comment;
  4. private String createtime;
  5. private Double score;
  6.  
  7. public String getUsername() {
  8. return username;
  9. }
  10.  
  11. public void setUsername(String username) {
  12. this.username = username;
  13. }
  14.  
  15. public String getComment() {
  16. return comment;
  17. }
  18.  
  19. public void setComment(String comment) {
  20. this.comment = comment;
  21. }
  22.  
  23. public String getCreatetime() {
  24. return createtime;
  25. }
  26.  
  27. public void setCreatetime(String createtime) {
  28. this.createtime = createtime;
  29. }
  30.  
  31. public Double getScore() {
  32. return score;
  33. }
  34.  
  35. public void setScore(Double score) {
  36. this.score = score;
  37. }
  38.  
  39. }
  40. }
  1. public class err {
  2. private int code;
  3. private String msg;
  4.  
  5. public int getCode() {
  6. return code;
  7. }
  8.  
  9. public void setCode(int code) {
  10. this.code = code;
  11. }
  12.  
  13. public String getMsg() {
  14. return msg;
  15. }
  16.  
  17. public void setMsg(String msg) {
  18. this.msg = msg;
  19. }
  20. }

注意上面内部类的运用。

解析:

  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

来自:http://blog.csdn.net/rain_butterfly/article/details/38404293

Android Gson解析json详解的更多相关文章

  1. Android Gson解析json工具类封装

    package com.springSecurity.gson; import java.util.ArrayList; import java.util.List; import java.util ...

  2. Python解析JSON详解

    JSON 函数 使用 JSON 函数需要导入 json 库:import json. 函数  描述 json.dumps  将 Python 对象编码成 JSON 字符串 json.loads  将已 ...

  3. 使用Python解析JSON详解

    为大家介绍如何使用 Python 语言来编码和解码 JSON 对象. JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写. JSON 函数 ...

  4. JAVA中的四种JSON解析方式详解

    JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...

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

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  6. Android网络之数据解析----使用Google Gson解析Json数据

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

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

    1.问题描述 首先,需要解析的Json数据类似于下面的格式,但是包含了Java关键字abstract: { ret: 0, msg: "normal return.", news: ...

  8. Android中使用Gson解析JSON数据

      Android中使用Gson解析JSON数据 在Android中可以使用Gson解析JSON数据 首先,从 code.google.com/p/google-gson/downloads/list ...

  9. 【Android进阶】Gson解析json字符串的简单应用

    在客户端与服务器之间进行数据传输,一般采用两种数据格式,一种是xml,一种是json.这两种数据交换形式各有千秋,比如使用json数据格式,数据量会比较小,传输速度快,放便解析,而采用xml数据格式, ...

随机推荐

  1. P2P通信原理与实现(C++)

    1.简介 当今互联网到处存在着一些中间件(MIddleBoxes),如NAT和防火墙,导致两个(不在同一内网)中的客户端无法直接通信.这些问题即便是到了IPV6时代也会存在,因为即使不需要NAT,但还 ...

  2. 如何让WCF服务更好地支持Web Request和AJAX调用

    WCF的确不错,它大大地简化和统一了服务的开发.但也有不少朋友问过我,说是在非.NET客户程序中,有何很好的方法直接调用服务吗?还有就是在AJAX的代码中(js)如何更好地调用WCF服务呢? 我首先比 ...

  3. java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener

    一:如果出现下面的错误信息,如果你的项目是Maven结构的,那么一般都是你的项目的Maven Dependencies没有添加到项目的编译路径下: 信息: The APR based Apache T ...

  4. msgpack配合FIREDAC传输多表数据

    msgpack配合FIREDAC传输多表数据 procedure TForm1.Button1Click(Sender: TObject);var ms, ms2: TMemoryStream; pa ...

  5. Xcode GDB 调试

    关于GDB 对于大多数Cocoa程序员来说,最常用的debugger莫过于Xcode自带的调试工具了.而实际上,它正是gdb的一个图形化包装.相对于gdb,图形化带来了很多便利,但同时也缺少了一些重要 ...

  6. DevExpress Components16.2.6 Source Code 编译

    DevExpress 是一个比较有名的界面控件套件,提供了一系列优秀的界面控件.这篇文章将展示如何在拥有源代码的情况下,对 DevExpress 的程序集进行重新编译. 特别提示:重编译后,已安装好的 ...

  7. openshift 添加cron定时任务

    一般linux添加cron任务是在/etc/crontab,但是由于openshift的权限木有这么开放,所以如果需要设置定时任务的话,需要在如下的文件夹下添加你的sh文件,因为我需要的是每天运行一次 ...

  8. Cocos2dx 小技巧(十四)ScrollView实现缩放效果

    这阶段心绪比較乱,所以这篇开头就不扯淡了.(谁说大姨夫来了我跟谁急!~~)说到大姨夫我突然想到英雄联盟有个美女讲解叫伊芙蕾亚,她的堂弟ID居然叫:姨夫累呀,好笑吧(呵呵,有点冷~~额,我都说不扯淡了) ...

  9. [Android UI] Activity Maintheme (Android 解决程序启动时的黑屏问题)

    <style name="MainTheme" parent="@android:style/Theme"> <item name=" ...

  10. scala编程第17章学习笔记(2)——集和映射

    默认情况下在使用“Set”或“Map”的时候,获得的都是不可变对象.如果需要的是可变版本,需要先写明引用. 如果同一个源文件中既要用到可变版本,也要用到不可变版本的集合或映射,方法之一是引用包含了可变 ...