Android Gson解析json详解

jopen 10年前

目前解析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());
解析复杂实例:

数据格式:

    {            "data": {                "partnerteamlist": [                    {                        "pteamId": 72825,                        "ptitle": "随摄影/共6套服装/准爸准妈共拍/免费肚画/底片全送。",                        "pteamprice": 288                    },                    {                        "pteamId": 72598,                        "ptitle": "随摄影/拍摄200张/4本相册/品质拍摄/送全新婚纱。",                        "pteamprice": 2888                    },                    {                        "pteamId": 72613,                        "ptitle": "随摄影/送全新婚纱/多外景拍摄/服装不限数量/绝无二次消费!",                        "pteamprice": 3699                    },                    {                        "pteamId": 72638,                        "ptitle": "随摄影/服装不限数量/高品质拍摄260张/送全新婚纱。",                        "pteamprice": 4299                    },                    {                        "pteamId": 72716,                        "ptitle": "随摄影/3组服装造型/内外景拍摄/完全透明消费!",                        "pteamprice": 388                    }                ],                "liketeamlist": [                    {                        "lteamId": 65886,                        "ltitle": "爱丽尔婚纱摄影/2本相册/6套服装造型/拍摄不限最低拍摄150张。",                        "limage": "http://img.pztuan.com/upfile/team/2013/0712/201307120257551465.jpg",                        "lteamprice": 518,                        "lmarketprice": 3999                    },                    {                        "lteamId": 57133,                        "ltitle": "陶冶摄影/婚纱闺蜜/6组服装造型/拍摄不低于120张!",                        "limage": "http://img.pztuan.com/upfile/team/2013/0628/201306281115249737.jpg",                        "lteamprice": 580,                        "lmarketprice": 3380                    }                ],                "feedbacks": {                    "feedbacklist": [                        {                            "comment": "5分",                            "createtime": "2014.07.08 13:38",                            "score": 5,                            "username": "l***2"                        }                    ],                    "totalcount": 1,                    "totalscore": 5                }            },            "err": null,            "state": 1        }  
</div> </div>
实体类(里面的成员变量和接口的返回值名称一 一对应才能保证解析正确):

    package com.pztuan.entity;                import java.util.List;                public class OtherDetail {                    private int state;            private List<err> err;            private OtherDetail2 data;                    public int getState() {                return state;            }                    public void setState(int state) {                this.state = state;            }                    public List<err> getErr() {                return err;            }                    public void setErr(List<err> err) {                this.err = err;            }                    public OtherDetail2 getData() {                return data;            }                    public void setData(OtherDetail2 data) {                this.data = data;            }                    public class OtherDetail2 {                private List<partnerteamlist> partnerteamlist;                private List<liketeamlist> liketeamlist;                private List<feedbacks> feedbacks;                        public List<liketeamlist> getLiketeamlist() {                    return liketeamlist;                }                        public void setLiketeamlist(List<liketeamlist> liketeamlist) {                    this.liketeamlist = liketeamlist;                }                        public List<feedbacks> getFeedbacks() {                    return feedbacks;                }                        public void setFeedbacks(List<feedbacks> feedbacks) {                    this.feedbacks = feedbacks;                }                        public class partnerteamlist {                    private int pteamId;                    private String ptitle;                    private Double pteamprice;                            public int getPteamId() {                        return pteamId;                    }                            public void setPteamId(int pteamId) {                        this.pteamId = pteamId;                    }                            public String getPtitle() {                        return ptitle;                    }                            public void setPtitle(String ptitle) {                        this.ptitle = ptitle;                    }                            public Double getPteamprice() {                        return pteamprice;                    }                            public void setPteamprice(Double pteamprice) {                        this.pteamprice = pteamprice;                    }                        }                        public class liketeamlist {                    private int lteamId;                    private String ltitle;                    private String limage;                    private Double lteamprice;                    private Double lmarketprice;                            public int getLteamId() {                        return lteamId;                    }                            public void setLteamId(int lteamId) {                        this.lteamId = lteamId;                    }                            public String getLtitle() {                        return ltitle;                    }                            public void setLtitle(String ltitle) {                        this.ltitle = ltitle;                    }                            public String getLimage() {                        return limage;                    }                            public void setLimage(String limage) {                        this.limage = limage;                    }                            public Double getLteamprice() {                        return lteamprice;                    }                            public void setLteamprice(Double lteamprice) {                        this.lteamprice = lteamprice;                    }                            public Double getLmarketprice() {                        return lmarketprice;                    }                            public void setLmarketprice(Double lmarketprice) {                        this.lmarketprice = lmarketprice;                    }                }                        public class feedbacks {                    private int totalcount;                    private Double totalscore;                    private List<feedbacklist> feedbacklist;                            public int getTotalcount() {                        return totalcount;                    }                            public void setTotalcount(int totalcount) {                        this.totalcount = totalcount;                    }                            public Double getTotalscore() {                        return totalscore;                    }                            public void setTotalscore(Double totalscore) {                        this.totalscore = totalscore;                    }                            public List<feedbacklist> getFeedbacklist() {                        return feedbacklist;                    }                            public void setFeedbacklist(List<feedbacklist> feedbacklist) {                        this.feedbacklist = feedbacklist;                    }                            public class feedbacklist {                        private String username;                        private String comment;                        private String createtime;                        private Double score;                                public String getUsername() {                            return username;                        }                                public void setUsername(String username) {                            this.username = username;                        }                                public String getComment() {                            return comment;                        }                                public void setComment(String comment) {                            this.comment = comment;                        }                                public String getCreatetime() {                            return createtime;                        }                                public void setCreatetime(String createtime) {                            this.createtime = createtime;                        }                                public Double getScore() {                            return score;                        }                                public void setScore(Double score) {                            this.score = score;                        }                            }                }                        public List<partnerteamlist> getPartnerteamlist() {                    return partnerteamlist;                }                        public void setPartnerteamlist(List<partnerteamlist> partnerteamlist) {                    this.partnerteamlist = partnerteamlist;                }            }                    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;                }            }        }  
</div> </div>
注意上面内部类的运用。</span>

解析:

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

若出现引用异常,请查看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