• Android Gson解析json详解


    目前解析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

  • 相关阅读:
    docker构建镜像
    SpringBoot 配置的加载
    Gradle实战(02)--Gradle Build的创建
    Gradle实战(01)--介绍与安装
    统计最常用10个命令的脚本
    jackson序列化与反序列化的应用实践
    go http请求流程分析
    java线程的3种实现方式及线程池
    git多账号使用
    java多版本管理
  • 原文地址:https://www.cnblogs.com/lr393993507/p/5772721.html
Copyright © 2020-2023  润新知