目前解析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数据:
String jsonData = "[{"username":"arthinking","userId":001},{"username":"Jason","userId":002}]"; try{ JsonReader reader = new JsonReader(new StringReader(jsonData)); reader.beginArray(); while(reader.hasNext()){ reader.beginObject(); while(reader.hasNext()){ String tagName = reader.nextName(); if(tagName.equals("username")){ System.out.println(reader.nextString()); } else if(tagName.equals("userId")){ System.out.println(reader.nextString()); } } reader.endObject(); } reader.endArray(); } catch(Exception e){ e.printStackTrace(); }
通过把JSON数据映射成一个对象,使用Gson对象的fromJson()方法获取一个对象数组进行操作:
创建JSON数据对应的一个POJO对象User.java:
public class User { private String username ; private int userId ; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } }
使用Gson对象获取User对象数据进行相应的操作:
Type listType = new TypeToken<LinkedList<User>>(){}.getType(); Gson gson = new Gson(); LinkedList<User> users = gson.fromJson(jsonData, listType); for (Iterator iterator = users.iterator(); iterator.hasNext();) { User user = (User) iterator.next(); System.out.println(user.getUsername()); System.out.println(user.getUserId()); }
如果要处理的JSON字符串只包含一个JSON对象,则可以直接使用fromJson获取一个User对象:
String jsonData = "{"username":"arthinking","userId":001}"; Gson gson = new Gson(); User user = gson.fromJson(jsonData, User.class); System.out.println(user.getUsername()); 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 }
public class err { private int code; private String msg; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
注意上面内部类的运用。
解析:
Gson gson = new Gson(); 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