Android中使用Google的GSON架構解析JSON資料----方便快捷(含代碼)

來源:互聯網
上載者:User

什麼是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"}].JSON資料的解析:解析JSON資料, 首先需要明確待解析的是JSON Object還是JSON array, 然後需要確定採用哪種解析技術. android平台上一般有2種解析技術可供選擇:android內建的org.json包和google的開源gson庫. 以下將分別採用這兩種技術解析JSON對象和JSON數組. 1.  採用android內建的org.json包解析JSON對象. 假設待解析的JSON資料為json = "{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}", 其中\用於轉義運算式中的雙引號. 首先定義2個JavaBean:[java]  package text.com.bean;    public class Address {      private String street;      private String city;      private String country;        public Address() {          super();      }        public Address(String street, String city, String country) {          super();          this.street = street;          this.city = city;          this.country = country;      }        public String getStreet() {          return street;      }        public void setStreet(String street) {          this.street = street;      }        public String getCity() {          return city;      }        public void setCity(String city) {          this.city = city;      }        public String getCountry() {          return country;      }        public void setCountry(String country) {          this.country = country;      }        @Override      public String toString() {          return "Address [street=" + street + ", city=" + city + ", country="                  + country + "]";      }    }   [java]  package text.com.bean;    public class Person {      private String name;      private int age;      private boolean male;      private Address address;        public Person() {          super();      }        public Person(String name, int age, boolean male, Address address) {          super();          this.name = name;          this.age = age;          this.male = male;          this.address = address;      }        public String getName() {          return name;      }        public void setName(String name) {          this.name = name;      }        public int getAge() {          return age;      }        public void setAge(int age) {          this.age = age;      }        public boolean isMale() {          return male;      }        public void setMale(boolean male) {          this.male = male;      }        public Address getAddress() {          return address;      }        public void setAddress(Address address) {          this.address = address;      }        @Override      public String toString() {          return "Person [name=" + name + ", age=" + age + ", male=" + male                  + ", address=" + address + "]";      }    }   首先使用方法一解析代碼如下:[java]  JSONObject jsonObject = new JSONObject(json);  String name = jsonObject.getString("name");  int age = jsonObject.getInt("age");  boolean male = jsonObject.getBoolean("male");  JSONObject addressJSON = jsonObject.getJSONObject("address");  String street = addressJSON.getString("street");  String city = addressJSON.getString("city");  String country = addressJSON.getString("country");  Address address = new Address(street, city, country);  Person person = new Person(name, age, male, address);  System.out.println(person);  LogCat的輸出為Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 說明已經正確解析了JSON對象. 2. 採用gson庫解析JSON對象. 假設帶解析的JSON資料是json = "{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}", 首先需要到http://code.google.com/p/google-gson/下載jar包, 並將其添加到項目中. 具體的解析代碼如下:[java]  Gson gson = new Gson();  Person person = gson.fromJson(json, Person.class);  System.out.println(person);  LogCat的輸出為Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 說明已經正確解析了JSON對象, 是不是很簡單? 3. 採用android內建的org.json包解析JSON數組. 假設待解析的JSON資料為json = "[{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}, {\"name\":\"min\", \"age\"=20, \"male\":false, \"address\":{\"street\":\"heiShiJiao\", \"city\":\"daLian\", \"country\":\"china\"}}]", 解析代碼如下:[java]  List<Person> persons = new ArrayList<Person>();  JSONArray jsonArray = new JSONArray(json);  for(int i = 0; i < jsonArray.length(); i++) {      JSONObject jsonObject = jsonArray.getJSONObject(i);      String name = jsonObject.getString("name");      int age = jsonObject.getInt("age");      boolean male = jsonObject.getBoolean("male");      JSONObject addressJSON = jsonObject.getJSONObject("address");      String street = addressJSON.getString("street");      String city = addressJSON.getString("city");      String country = addressJSON.getString("country");      Address address = new Address(street, city, country);      Person person = new Person(name, age, male, address);      persons.add(person);  }  System.out.println(persons);  LogCat的輸出為[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 說明已經正確解析了JSON數組. 4. 採用gson庫解析JSON數組. 待解析的JSON資料同上, 具體代碼為:[java]  Gson gson = new Gson();  Type listType = new TypeToken<List<Person>>(){}.getType();  List<Person> persons = gson.fromJson(json, listType);  LogCat的輸出為[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 說明已經正確解析了JSON數組.new TypeToken<List<Person>>(){}.getType(); 這句代碼錶示建立一個TypeToken的匿名子類對象, 並調用對象的getType()方法. org.json包和gson庫還有很多其他有用的API, 需要的時候可查看文檔. 比如有的時候需要通過java對象或java集合和數組產生json資料上傳給伺服器, 當然你可以自我構造json字串, 但會很麻煩. 這個時候就可以使用其中的有關API, 方便的完成這項工作.  測試案例: [java]  package text.com;    import java.io.BufferedReader;  import java.io.File;  import java.io.FileInputStream;  import java.io.InputStreamReader;  import java.lang.reflect.Type;  import java.util.List;    import text.com.bean.Address;  import text.com.bean.Person;    import com.google.gson.Gson;  import com.google.gson.reflect.TypeToken;    public class JsonTest {      String jsonString = "";        public static void main(String[] args) {          // Person p1 = new Person("zhangsan", 12, true, new Address("北京", "海澱區",          // "30號"));          // Person p2 = new Person("zhangsan", 12, true, new Address("北京", "海澱區",          // "30號"));          // Person p3 = new Person("zhangsan", 12, true, new Address("北京", "海澱區",          // "30號"));          // List<Person> list = new ArrayList<Person>();          // list.add(p1);          // list.add(p2);          // list.add(p3);          // Gson gson = new Gson();          // Type typeOfT = new TypeToken<List<Person>>(){}.getType();          // String json = gson.toJson(list, typeOfT);          // System.out.println("json:"+json);            // String str = readTxtFile("D:\\cjjworkspace\\Test\\json.txt");          // System.out.println("檔案內容:" + str);           Gson gson = new Gson();          // Type typeOfT = new TypeToken<List<Person>>(){}.getType();          // List<Person> personList = gson.fromJson(str, typeOfT);            Person p1 = new Person("zhangsan", 12, true, new Address("北京", "海澱區", "30號"));          Type typeOfT = new TypeToken<Person>(){}.getType();          String str = gson.toJson(p1, typeOfT);          System.out.println(str);      }        public static String readTxtFile(String filePath) {          String encoding = "utf-8";          StringBuilder sb = new StringBuilder();          try {              File file = new File(filePath);              if (file.isFile() && file.exists()) { // 判斷檔案是否存在                  InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考慮到編碼格式                  BufferedReader bufferedReader = new BufferedReader(read);                  String str = "";                  while ((str = bufferedReader.readLine()) != null) {                      sb.append(str);                  }                  read.close();                  return sb.toString();              } else {                  System.out.println("找不到指定的檔案");                  return null;              }          } catch (Exception e) {              System.out.println("讀取檔案內容出錯");              e.printStackTrace();          }          return sb.toString();      }  }     附帶:gson-2.2.4.jar           gson-2.2.4-javadoc.jar           gson-2.2.4-sources.jar 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.