什麼是JSON:
JavaScript Object Notation是一種輕量級的資料交換格式
與xml差異:
+ JSON相對於XML來講,資料的體積小
+ JSON與JavaScript的互動更加方便
+ JSON的速度要遠遠快於XML
+ JSON對資料的描述性比XML較差
JSON構成:
(1) 對象:無序的“‘名稱/值’對”集合。一個對象以“{”開始,以“}”結束。每個“名稱”後跟一個“:”,“‘名稱/值’對”之間使用“,”分隔。
(2) 數組:值(value)的有序集合。一個數組以“[”開始,“]”結束。值之間使用“,”分隔。其中,值(value)可以是雙引號括起來的字串(String)、數值(number)、true、false、null、對象(object)或者數組(array)。這些結構可以嵌套。
Gson方法:數組<--->Json
int[] numbers = {1, 1, 2, 3, 5, 8, 13};String[] days = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};Gson gson = new Gson();String numbersJson = gson.toJson(numbers);String daysJson = gson.toJson(days);System.out.println("numbersJson = " + numbersJson);//numbersJson = [1,1,2,3,5,8,13]System.out.println("daysJson = " + daysJson);//daysJson = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]int[] fibonacci = gson.fromJson(numbersJson, int[].class);String[] weekDays = gson.fromJson(daysJson, String[].class);
集合<--->Json
List<String> names = new ArrayList<String>();names.add("Alice");names.add("Bob");names.add("Carol");names.add("Mallory");Gson gson = new Gson();String jsonNames = gson.toJson(names);//jsonNames = ["Alice","Bob","Carol","Mallory"]Student a = new Student("Alice", "Apple St", new Date(2000, 10, 1));Student b = new Student("Bob", "Banana St", null);Student c = new Student("Carol", "Grape St", new Date(2000, 5, 21));Student d = new Student("Mallory", "Mango St", null);List<Student> students = new ArrayList<Student>();students.add(a);students.add(b);students.add(c);students.add(d);gson = new Gson();String jsonStudents = gson.toJson(students);//[{"name":"Alice","address":"Apple St","dateOfBirth":"Nov 1, 3900 12:00:00 AM"},{"name":"Bob","address":"Banana St"},{"name":"Carol","address":"Grape St","dateOfBirth":"Jun 21, 3900 12:00:00 AM"},{"name":"Mallory","address":"Mango St"}]Type type = new TypeToken<List<Student>>(){}.getType();List<Student> studentList = gson.fromJson(jsonStudents, type);Map<--->JsonMap<String, String> colours = new HashMap<String, String>();colours.put("BLACK", "#000000");colours.put("RED", "#FF0000");colours.put("GREEN", "#008000");colours.put("BLUE", "#0000FF");colours.put("YELLOW", "#FFFF00");colours.put("WHITE", "#FFFFFF");Gson gson = new Gson();String json = gson.toJson(colours);//{"WHITE":"#FFFFFF","BLUE":"#0000FF","YELLOW":"#FFFF00","GREEN":"#008000","BLACK":"#000000","RED":"#FF0000"}Type type = new TypeToken<Map<String, String>>(){}.getType();Map<String, String> map = gson.fromJson(json, type);for (String key : map.keySet()) { System.out.println("map.get = " + map.get(key));}
對象<--->Json
Student student = new Student("Duke", "Menlo Park", dob.getTime());Gson gson = new Gson();String json = gson.toJson(student);//{"name":"Duke","address":"Menlo Park","dateOfBirth":"Feb 1, 2000 12:00:00 AM"}Gson gson = new Gson();Student student = gson.fromJson(json, Student.class);
嵌套解析
package test0328;import java.util.Arrays;public class Person {/* * { "phone" : ["112233", "445566"], // 數組 "name" : "android", // 字串 "age" : 5, // 數值 "address" : { "country" : "china", "province" : "ShangHai" }, // 對象 "married" : false // 布爾值 }, * */private String[] phone;/** * @return the address */public Address getAddress() {return address;}/** * @param address * the address to set */public void setAddress(Address address) {this.address = address;}private String name;private int age;private Address address = null;private boolean married;/** * @return the phone */public String[] getPhone() {return phone;}/** * @param phone * the phone to set */public void setPhone(String[] phone) {this.phone = phone;}/* * (non-Javadoc) * * @see java.lang.Object#toString() */@Overridepublic String toString() {return "Person [phone=" + Arrays.toString(phone) + ", name=" + name+ ", age=" + age + ", address=" + address + ", married="+ married + "]";}/** * @return the name */public String getName() {return name;}/** * @param name * the name to set */public void setName(String name) {this.name = name;}/** * @return the age */public int getAge() {return age;}/** * @param age * the age to set */public void setAge(int age) {this.age = age;}/** * @return the married */public boolean isMarried() {return married;}/** * @param married * the married to set */public void setMarried(boolean married) {this.married = married;}}
package test0328;public class Address {// "address" : { "country" : "china", "province" : "ShangHai" }, // 對象 private String country;private String province;/** * @return the country */public String getCountry() {return country;}/** * @param country * the country to set */public void setCountry(String country) {this.country = country;}/** * @return the province */public String getProvince() {return province;}/** * @param province * the province to set */public void setProvince(String province) {this.province = province;}/* * (non-Javadoc) * * @see java.lang.Object#toString() */@Overridepublic String toString() {return "Address [country=" + country + ", province=" + province + "]";}}
package test0328;import java.io.StringReader;import com.google.gson.Gson;import com.google.gson.stream.JsonReader;public class Json {/*[{ "phone" : ["112233", "445566"], // 數組 "name" : "android", // 字串 "age" : 5, // 數值 "address" : { "country" : "PRC", "province" : "ShangHai" }, // 對象 "married" : false // 布爾值 }, { "phone" : ["778899", "224466"], // 數組 "name" : "Linux", // 字串 "age" : 15, // 數值 "address" : { "country" : "USA", "province" : "NY" }, // 對象 "married" : true // 布爾值 }] */private static final String Json = "[{\"phone\" : [\"112233\", \"445566\"], \"name\" : \"android\", \"age\" : 5, \"address\" : { \"country\" : \"china\", \"province\" : \"ShangHai\" }, \"married\" : false},{\"phone\" : [\"778899\", \"224466\"], \"name\" : \"linux\",\"age\" : 15, \"address\" : { \"country\" : \"USA\", \"province\" : \"NY\" },\"married\" : true }]";private static Gson gson = new Gson();public static void main(String[] args) throws Exception {JsonReader reader = new JsonReader(new StringReader(Json));reader.beginArray();//開始數組while(reader.hasNext()){//迴圈reader.beginObject();//開始對象Person person = new Person();while(reader.hasNext()){//迴圈String tagName = reader.nextName();if("phone".equals(tagName)){reader.beginArray(); String[] phones = new String[2]; phones[0] = reader.nextString(); phones[1] = reader.nextString(); person.setPhone(phones);reader.endArray();}else if("name".equals(tagName)){person.setName(reader.nextString());}else if("age".equals(tagName)){person.setAge(reader.nextInt());}else if("address".equals(tagName)){reader.beginObject();Address address = new Address();while(reader.hasNext()){int i = 0;String tagName2 = reader.nextName();if("country".equals(tagName2)){address.setCountry(reader.nextString());}else{address.setProvince(reader.nextString());}}person.setAddress(address);reader.endObject();}else if("married".equals(tagName)){person.setMarried(reader.nextBoolean());}}reader.endObject();System.out.println(person);}reader.endArray();}public static int[] intsfromJson(String json){return gson.fromJson(json, int[].class);}public static String[] stringsfromJson(String json){return gson.fromJson(json, String[].class);}}