Android中利用Gson解析Json

來源:互聯網
上載者:User

標籤:android   gson   android開發   

在Android開發中,Json是一種用戶端與伺服器端互動的一種語言,它文法簡單,最好的是目前市面上有很便捷的輪子可以對他進行解析。例如,Gson就是google提供的一款用於解析或者產生Json的庫,可以直接將Json字串映射成對應的實體類,十分方便。下面我總結一下利用Gson解析Json的用法以及我遇到的問題。

最簡單對象的解析:

例如下邊這段Json字串:

{    text: "Love",    img:"http://img2.imgtn.bdimg.com/it/u=2346639372,3797158284&fm=21&gp=0.jpg"}  

如果我要解析它,可以直接定義一個對象,比如:

class LoveJson{    String text;//這個名字要與json字串中的相對應才能解析出來    String img;}

然後在需要解析的時候調用Gson來解析:

String jsonString;//待解析的json字串Gson gson = new Gson();LoveJson love = gson.from(jsonString,Love.class);

短短几行就解析完了,有輪子就是如此方便。那麼我們再看幾種比較複雜的解析,最後,我再說下我遇到的問題以及解決方案。

其他比較複雜的解析:巢狀型別的解析
嵌套的Json類型無非就是這樣的:
{    school:"12級一班"    student_number:54    {        student_name:"zhangsan"        id:21    }}

那麼解析的類應該這樣寫:

class SchoolJson{    String school;    String studentNumber;    public static class Student{        String studentName;        int id;    }}

如果你有強迫症,變數非得用駝峰命名法,那麼就用註解:

class SchoolJson{    String school;    @SerializedName("studen_number")    String studentNumber;    public static class Student{        @SerializedName("student_name")        String studentName;        int id;    }}
數群組類型的解析

也是很簡單的,都是一個套路,比如:

[    {        student_name:"zhangsan"        id:1    },    {        student_name:"lisi"        id:2    },    ...]
class Student{    @SerializedName("student_name")    String studentName;    int id;}

解析的時候可以這樣:

Gson gson = new Gson();Student[] students = gson.from(jsonString,Student[].class);
解析Json的原則

以後可能會遇見更加複雜的,比如對象裡邊嵌套數組,數組裡邊嵌套對象,對象裡邊又嵌套數組…所以這裡邊有一個原則:

當遇到對象也就是大括弧的時候,寫成一個對象,遇到數組的時候,可以定義成一個List<>然後再這個List<>下邊定義一個表示數組元素的類(如果數組元素還是對象的話)。如此迴圈下去即可。
下面我舉個稍微複雜點的例子:
json字串:

{    stories: [        {            images: [              "http://pic1.zhimg.com/84dadf360399e0de406c133153fc4ab8_t.jpg"            ],            type: 0,            id: 4239728,            title: "前蘇聯監獄紋身百科圖鑑"        },        {          "type": 0,          "id": 7086807,          "title": "職人介紹所 ·  自閉兒童的解鎖人"        },        {          "images": [            "http://pic2.zhimg.com/afecdc04983a8e261326386995150599_t.jpg"          ],          "type": 0,          "id": 7066097,          "title": "家庭的生命週期:關於「離家」"        },        ...    ],    description: "為你發現最有趣的新鮮事,建議在 WiFi 下查看",    background: "http://pic1.zhimg.com/a5128188ed788005ad50840a42079c41.jpg",    color: 8307764,    name: "不許無聊",    image: "http://pic3.zhimg.com/da1fcaf6a02d1223d130d5b106e828b9.jpg",    editors: [        {            url: "http://www.zhihu.com/people/wezeit",            bio: "微在 Wezeit 主編",            id: 70,            avatar: "http://pic4.zhimg.com/068311926_m.jpg",            name: "益康糯米"        },        ...    ],    image_source: ""}

用於解析的類可以這樣寫:

public class SubjectDailyContentJson{    public List<Story> stories = new ArrayList<>();    public static class Story implements Serializable{        List<String> images;        int type;        int id;        String title;    }    public String description;    public String background;    public int color;    public String name;    public String image;    public List<Editor> editors;    public static class Editor{        String url;        String bio;        int id;        String avator;        String name;    }    @SerializedName("image_source")    public String imageSource;}

只要遵循那個原則,是不是很簡單呢?可是最近我遇到一個問題令我很不開心,他的數組裡的元素居然不是一樣的樣式,觀察一下上邊的那個json字串,他的stories數組裡邊的元素的格式居然不是統一的,有的是這樣:

{            images: [              "http://pic1.zhimg.com/84dadf360399e0de406c133153fc4ab8_t.jpg"            ],            type: 0,            id: 4239728,            title: "前蘇聯監獄紋身百科圖鑑"},

有的是這樣:

    {      "type": 0,      "id": 7086807,      "title": "職人介紹所 ·  自閉兒童的解鎖人"    }

那要怎麼辦呢,我蛋疼了一陣子,也終於找到了一個方法解決,他們兩個的區別無非就是有沒有images那個數組,那我乾脆只要有的全寫在我的類裡邊,然後將那些有可能沒有的屬性,我提前給他new一個值,這個樣子的話,如果沒有的話json解析成一個類時這個屬性就為null,我們只要判斷一下就可以了。你看,我那個images那個鏈表我就給他new了一個。

今天的Gson的用法的總結就到這裡了,以後需要用到新的知識的話再做補充。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Android中利用Gson解析Json

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.