1. 程式人生 > >Gson-解析json之利器

Gson-解析json之利器

Gson(又稱Google Gson)是Google公司釋出的一個開放原始碼的Java庫,主要用途為序列化Java物件為JSON字串,或反序列化JSON字串成Java物件。GSON核心jar包不到1M,非常精簡,但提供的功能無疑是非常強大的,如果使用JDK自帶的JSON解析API,使用起來相對比較繁瑣一點,而且程式碼量較多。

下面通過一個表格來了解一下,GSON目前的發展狀況






下圖是,使用GSON轉換時報的一個異常。
Java程式碼  收藏程式碼
  1. Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1
     column 2  
  2.     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)  
  3.     at com.google.gson.Gson.fromJson(Gson.java:803)  
  4.     at com.google.gson.Gson.fromJson(Gson.java:768)  
  5.     at com.google.gson.Gson.fromJson(Gson.java:717)  
  6.     at com.google.gson.Gson.fromJson(Gson.java:689
    )  
  7.     at com.demoone.UseGson.testOneBeanFromJSON(UseGson.java:54)  
  8.     at com.demoone.UseGson.main(UseGson.java:89)  
  9. Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2   //注意這句話跟陣列集合有關  
  10.     at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374
    )  
  11.     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)  
  12.     ... 6 more  


下面貼出,筆者的測試原始碼,注意上述異常,在程式碼的註釋中已經指出問題原因
Java程式碼  收藏程式碼
  1. package com.demoone;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. import com.entity.Person;  
  5. import com.google.gson.Gson;  
  6. import com.google.gson.reflect.*;  
  7. /*** 
  8.  *  
  9.  * 使用gson 
  10.  * 進行序列化,反序列化的操作 
  11.  * json 
  12.  *  
  13.  * **/  
  14. public class UseGson {  
  15.  static Gson g=new Gson();  
  16.  /** 
  17.   *  
  18.   * 由集合型別的實體類 
  19.   * 轉換成Json型別 
  20.   *  
  21.   * **/  
  22.     public static void testToJSON(){  
  23.         List<Person> list=new ArrayList<>();  
  24.         for(int i=0;i<2;i++){  
  25.          Person p=new Person(i, "散仙"+i, "北京市"+i, "[email protected]"500.0);  
  26.             list.add(p);  
  27.         }  
  28.         String json=g.toJson(list);  
  29.         System.out.println(json);  
  30.     }  
  31.     /** 
  32.      * 由json轉換為實體類 
  33.      *  
  34.      * */  
  35.     public static void testOneBeanFromJSON(){  
  36.         /** 
  37.          * 轉換一個Java Bean的時候 
  38.          * 記住不能使用[],只有在使用集合的時候才可以使用  
  39.          * 如上圖貼的那個異常就是由此原因造成的,另外 
  40.          * 格式要規範,中間不能出現空格字元 
  41.          *  
  42.          * **/  
  43.         String jsonBean="[{\"id\":0,\"name\":\"散仙0\",\"address\":\"北京市0\",\"email\":\"[email protected]\",\"money\":500.0}]";  
  44.          Person p=g.fromJson(jsonBean, Person.class);  
  45.          System.out.println(p);  
  46.     }  
  47.     /** 
  48.      * 由json轉換為實體類集合 
  49.      *  
  50.      * */  
  51.     public static void testListBeanFromJSON(){  
  52.          /** 
  53.           * 轉換一個集合 的實體Bean 
  54.           * 注意前面加上[]方括號,代表一個數組 
  55.           * **/  
  56.          String  jsonBeanList="[{\"id\":0,\"name\":\"散仙0\",\"address\":\"北京市0\",\"email\":\"[email protected]\",\"money\":500.0},{\"id\":1,\"name\":\"散仙1\",\"address\":\"北京市1\",\"email\":\"[email protected]\",\"money\":500.0}]";  
  57.          List<Person> lists=g.fromJson(jsonBeanList,new   TypeToken<List<Person>>(){}.getType());  
  58.          System.out.println("反序列之後");  
  59.          for(Person pp:lists){  
  60.              System.out.println(pp);  
  61.          }  
  62.     }  
  63.     public static void main(String[] args) {  
  64.          testListBeanFromJSON();//測試集合反序列化  
  65.          testOneBeanFromJSON();//測試單個實體類反序列化  
  66.          //testToJSON();//測試序列化  
  67.     }  
  68. }  

執行結果:
Java程式碼  收藏程式碼
  1. testListBeanFromJSON()  方法:  
  2. 反序列之後  
  3. 編號:0  名字:散仙0   地址:北京市0   E-mail:54152541@qq.com  錢:500.0  
  4. 編號:1  名字:散仙1   地址:北京市1   E-mail:54152541@qq.com  錢:500.0  
  5. testOneBeanFromJSON()  方法:  
  6. 編號:0  名字:散仙0   地址:北京市0   E-mail:54152541@qq.com  錢:500.0  



實體類Person:

Java程式碼  收藏程式碼
  1. package com.entity;  
  2. /** 
  3.  * 實體類 
  4.  *  
  5.  *  
  6.  * **/  
  7. public class Person {  
  8.     private int id;  
  9.     private String name;  
  10.     private String address;  
  11.     private String email;  
  12.     private double money;  
  13.     @Override  
  14.     public String toString() {  
  15.         // TODO Auto-generated method stub  
  16.         return  "編號:"+id+"  名字:"+name+"   地址:"+address+"   E-mail:"+email+"  錢:"+money;  
  17.     }  
  18.     public Person() {  
  19.         // TODO Auto-generated constructor stub  
  20.     }  
  21.     public Person(int id, String name, String address, String email,  
  22.             double money) {  
  23.         super();  
  24.         this.id = id;  
  25.         this.name = name;  
  26.         this.address = address;  
  27.         this.email = email;  
  28.         this.money = money;  
  29.     }  
  30.     public int getId() {  
  31.         return id;  
  32.     }  
  33.     public void setId(int id) {  
  34.         this.id = id;  
  35.     }  
  36.     public String getName() {  
  37.         return name;  
  38.     }  
  39.     public void setName(String name) {  
  40.         this.name = name;  
  41.     }  
  42.     public String getAddress() {  
  43.         return address;  
  44.     }  
  45.     public void setAddress(String address) {  
  46.         this.address = address;  
  47.     }  
  48.     public String getEmail() {  
  49.         return email;  
  50.     }  
  51.     public void setEmail(String email) {  
  52.         this.email = email;  
  53.     }  
  54.     public double getMoney() {  
  55.         return money;  
  56.     }  
  57.     public void setMoney(double money) {  
  58.         this.money = money;  
  59.     }  
  60. }  


體會到了GSON的強大了吧,GSON還可以使用註解簡化,在這裡筆者就不給出程式碼了,有興趣的讀者可以自己研究一下

包含jar,javadoc,source的壓縮包,google-gson-2.2.2-release.zip下載:http://download.csdn.net/detail/u010122002/7729949

相關推薦

Gson-解析json利器

Gson(又稱Google Gson)是Google公司釋出的一個開放原始碼的Java庫,主要用途為序列化Java物件為JSON字串,或反序列化JSON字串成Java物件。GSON核心jar包不到1M,非常精簡,但提供的功能無疑是非常強大的,如果使用JDK自帶的JSON解析

Android使用GSON解析JSON資料

GSON簡介: GSON是Google提供的用來在Java物件和JSON資料之間進行對映的Java類庫。GSON可以很容易的將一串JSON資料轉換為一個Java物件,或是將 一個Java物件轉換為相應的JSON資料。 使用GSON解析JSON資料的基本

android開發 Gson 解析json陣列

為了紀念兩天解決的一個問題。 剛剛接觸到android的volley 框架,使用jsonarrayrequest的時候,得到jsonarray 問高手說可以用Gson 來解析於是開始了兩天的鑽研之路。 首先我的資料是這樣的 然後,你需要自己寫一個類,對應後臺資料的一個

Android網路資料解析----使用Google Gson解析Json資料

<span style="font-size:18px;">一、Json資料的介紹

Gson解析json

down googl -s span info 解析 實例 pack targe 以下是我依據Gson對json做的一些解析案例,如今我來說說Gson是如何進行Json解析的。 新建一個project: WeatherDemo,導入Gson包。Gson庫導入完畢之後就開

json-lib解析json二維JSONArray

我們 方式 數據 利用 2.2.3 .cn ima 解析json 有一種 在接口測試中,不管是接口的請求報文還是接口的響應報文,數據全部使用json,在工作中避免不了去解析響應報文以獲取某個鍵的值,解析josn有兩種方式,一種是利用jackson,還有一種就是利用json-

Android Gson解析json工具類封裝

pac spa google lis object sonar andro on() div package com.springSecurity.gson; import java.util.ArrayList; import java.util.List

Gson解析json數組

ken log rom new linked listt new t getjson string String getjson = (String) msg.obj;Type listType = new TypeToken<LinkedList<bean&g

json數據格式和gson解析json的應用

shu from ... gin color OS inter list json數據格式 首先json的數據格式分為三種:數組、對象、數組對象混合 數組格式: {"asd","qwe","ffe"} 對象格式: {"a":1,"b":2,"c":3} 註意寫代碼中要加入

gson解析json的問題

過去 成長 回老家 自然 把他 生命 電視 快餐 愛的 <p>  今天下了一天的雨,心情也像這天氣一樣,壓抑、沈悶。 以前每次在,屋子裏看著外面下雨,心理都特別的溫暖。小時候,每次下雨了,媽媽都會給我找出一件厚厚的衣服讓我穿上,然後我總會趴在炕上美美的看著電視。

GSON 解析 JSON

GSON JSON 介紹 Gson 下載 Gson 解析 和 格式化 Gson 格式化 Gson 解析 解析assets目錄下的Json檔案 ## Json 介紹 Json 全稱

Gson解析json資料

簡介: Json資料是類似xml型別的資料轉化格式但是它的傳輸速率遠遠高於xml的解析速率。 這裡簡單的對用gson解析json格式的資料,為什麼說是簡單的介紹呢,因為博主有更簡單的解析方式後期會進行推出或者掃描頭像進 行私聊(公眾號)。 進行整合:  這裡按照a

gson解析json字串

String retJson = HttpRequestUtil.sendGet1(url, auth, null); JsonParser parser = new JsonParser(); JsonObject ret = parser.parse(retJson).getAsJ

解析JSON資料格式

JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。JSON採用完全獨立於語言的文字格式,這些特性使JSON成為理想的資料交換語言。易於人閱讀和編寫,同時也易於機器解析和生成。 基礎結構 JSON建構於兩種結構: 1.“名稱/值”對的集合(A col

android Gson解析JSON資料中動態未知欄位key的方法

有時在解析json資料中的欄位key是動態可變的時候,由於Gson是使用靜態註解的方式來設定實體物件的,因此我們很難直接對返回的型別來判斷。但Gson在解析過程中如果不知道解析的欄位,就會將所有變數儲存在一個Map中,我們只要例項化這個map就能動態地取出key和value了。先給出一段js

shell解析jsonjq工具

 工具下載地址及各版本的安裝方式,我常用的是把工具包下載下來直接用,不安裝: https://stedolan.github.io/jq/manual/#example1 test.json {     "sys": {         "valid": "true",  

Android-Gson解析JSON資料(JSON物件/JSON陣列)

上一篇部落格,Android-解析JSON資料(JSON物件/JSON陣列),介紹了使用 org.json.JSONArray;/org.json.JSONObject; 來解析JSON資料;   Google Android 還提供來另外一種方式來解析JSON資料,那就是Gson;

快速上手Gson解析json

 Gson(google封裝的)的一款解析json的工具類  匯入jar包。jar包可以通過Maven倉庫下載 https://mvnrepository.com/artifact/com.google.code.gson/gson json例子: 直

Gson解析json時出現Expected a string but was BEGIN_ARRAY異常,由此發現Gson和FastJson區別

結果:[{"catalog":"環境搭建","article":[{"read":1,"column":9,"id":2,"title":"IntelliJIDEA環境搭建","slug":"static/kotlin_article/0_1.html"},{"read":1,"column":9,"id":

使用volley請求資料,Gson解析json的時候出現中文亂碼問題

首先來看一下我出現的問題! 遇到的過問題的人,或上網也可以查的到,仔細看,我列印的Log日誌就是解析的資料,出現亂碼了,那說明這個jsonString是獲取到的資料,看後的兩個引數,第一個是.data這個意思應該就資料,而後面的就是轉碼格式,看原始碼就會知道,這個應該是預設