標籤: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