javascript
Json、Gson、FAST-JSON解析学习
Json
JavaScript Object Notation javascript表示對象的一種方式
基于JavaScript語言的輕量級的數據交換格式;即:用來傳輸數據的一種格式.不管是web應用,還是android應用,現在傳輸數據的方式更多是采用json的格式。我們來對比下json同XML的差別
Android也已經內置了對json解析的支持,所以不需要導入jar包。
需要的jar包:
兩個類:
- 當json字符串以”{“開始,用JSONObject解析
- 當json字符串以”[“開始,用JSONArray解析
JSONObject
|–getString(String key)根據鍵找到對應該的值
|–getInt(String key) 得到int類型的值
|–getJSONObject(String key)得到JSONObject
|–put(String key,String/Boolean/Object^^)
構造方法
|–new JSONObject(String source) 把對應的String類型的JSON數據轉成JSON的對象
|–new JSONObject(Object bean) 將bean對象轉成Json對象,用于轉成json字符串
下面用一個Demo來演示下Json解析
車類
public class Car {private String brand; //車型private String color;//車的顏色private int price; //車的價錢public Car(String brand, String color, int price) { //有參構造super();this.brand = brand;this.color = color;this.price = price;}public Car() {//無參構造super();// TODO Auto-generated constructor stub}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}@Overridepublic String toString() { //重寫toStringreturn "Car [brand=" + brand + ", color=" + color + ", price=" + price+ "]";}}車展的類
import java.util.List;public class ShowObj {private String address;//車展的地址private String time; //車展示的時間private List<Car> carList; //車展中的眾多車的集合public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public List<Car> getCarList() {return carList;}public void setCarList(List<Car> carList) {this.carList = carList;}@Overridepublic String toString() {return "ShowObj [address=" + address + ", time=" + time + ", carList="+ carList + "]";}} import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject;//new Car("寶馬","150","red"); /** json字符串:* 1.表示對象* {brand:'寶馬',color:'red',price:150}* 2.表示數組* [{brand:'寶馬',color:'red',price:150},{brand:'路虎',color:'black',price:180},{brand:'法拉利',color:'yellow',price:200}]* * 3.表示復雜的對象* Engine engine = new Engine("華為","400");* Car car = new Car("寶馬", "red", 150, engine );* * {brand:'寶馬',color:'red',price:150,engine:{company:'華為',horsePower:'400'}}* * 4.表示含有數組或者集合的對象:比如說描述車展:車展的地點,車展的時間,車展的參展車型* {address:'深圳灣體育館',time:'2016-10-1',cars:[{brand:'寶馬',color:'red',price:150},{brand:'路虎',color:'black',price:180},{brand:'法拉利',color:'yellow',price:200}]}* * * 總結:* json對象用{},看見{}就是json對象* json數組[],看見[]就是json對象組成的數組********************************************************* xml:<car><brand>寶馬</brand><color>red</color><price>150</price></car>*jso和xml的區別:----面試*json數據量小,可讀性差。只用于保存數據*xml數據量大,可讀性好。可以用于軟件配置和布局繪制***********************************************************json解析三種:原生解析(最靈活,步驟繁雜)/fastjson/gson()**1.原生解析*步驟:* 導入jar包* 看見{},創建JSONObject對象* 看見[],創建JsonArray對象*** */public class Json2ObjDemo {public static void main(String[] args) throws JSONException {testObject(); //對象的json數據解析testArray(); //數組的Json數據解析testFuZa(); //復雜Json數據解析}// 解析對象 private static void testObject() throws JSONException {String jsonStr = "{brand:'寶馬',price:150,clr:'red'}";// 1.解析簡單對象:參數是要解析的字符串JSONObject jObject = new JSONObject(jsonStr);// 2.解析Car car = new Car();String brand = jObject.getString("brand");car.setBrand(brand);car.setColor(jObject.getString("clr"));car.setPrice(jObject.getInt("price"));System.out.println(car);}}// 解析數組private static void testArray() throws JSONException {String jsonString = "[{brand:'寶馬',color:'red',price:150},{brand:'路虎',color:'black',price:180},{brand:'法拉利',color:'yellow',price:200}]";//這里我們看到以"["開頭那么果斷new一個JSON的數組JSONArray jArray = new JSONArray(jsonString);// System.out.println(jArray.length());List<Car> carList = new ArrayList<>();for (int i = 0; i < jArray.length(); i++) {//通過遍歷獲取每個對象JSONObject jObject = jArray.getJSONObject(i);Car car = new Car();car.setBrand(jObject.getString("brand"));car.setColor(jObject.getString("color"));car.setPrice(jObject.getInt("price"));carList.add(car);//添加到車集}System.out.println(carList);}// 解析含有數組或者集合的對象private static void testFuZa() throws JSONException {/*這個json數據相對復雜 可以看做一個對象中除了自己的普通成員變量外還嵌套了一個Car類型的的集合,從這里的分析我們可以創建好類也就是ShowObj中定義一個Car集的原意*/String jString = "{address:'深圳灣體育館',time:'2016-10-1',cars:[{brand:'寶馬',color:'red',price:150},{brand:'路虎',color:'black',price:180},{brand:'法拉利',color:'yellow',price:200}]}";//將要解析的JSON字符串JSONObject jsonObject = new JSONObject(jString); //看見"{"所以我們new一個JSONObject類ShowObj sObj = new ShowObj(); //創建出車展的對象//將獲取的地址為車站對象初始化sObj.setAddress(jsonObject.getString("address"));//將獲取的車展時間為車站對象初始化sObj.setTime(jsonObject.getString("time"));// 先獲得json數組對象JSONArray jArray = jsonObject.getJSONArray("cars");//這里通過jsonObject獲取一個對象數組接下來就是遍歷這個數組中的每個對象然后獲取每個對象的值List<Car> carList = new ArrayList<>();//創建一個Car集for (int i = 0; i < jArray.length(); i++) {JSONObject jObject = jArray.getJSONObject(i);//獲取的一個JSON對象Car car = new Car();//new一個車car.setBrand(jObject.getString("brand"));//為這個車賦值car.setColor(jObject.getString("color"));//為這個車賦值car.setPrice(jObject.getInt("price"));//為這個車賦值carList.add(car);//每得到一個車就添加到list中}sObj.setCarList(carList);//設置車站的車集屬性//至此一個相對復雜的JSON數據就解析完成了我們打印下結果 //這里主要的思想是觀察JSON數據的結構創建相應類用于保存數據 System.out.println(sObj);}讀者可能會想這么麻煩竟然JAVA采用面向對象的思想那么有沒有更快捷的工具類為我們提供解析呢? 肯定有 == 下面我們來看看更快速的解析
Gson
public class Car { //車類private String brand; //車型private String color; //車顏色private double price; //車價格private Prduct engine; //車的引擎public Prduct getEngine() {return engine;}public void setEngine(Prduct engine) {this.engine = engine;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public String getColor() {return color;}public void setColor(String color) {this.color = color;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Car(String brand, String color, double price) {super();this.brand = brand;this.color = color;this.price = price;}@Overridepublic String toString() {return "Car [brand=" + brand + ", color=" + color + ", price=" + price+ ", engine=" + engine + "]";}} public class Prduct { //車引擎產地private String company;private String horsePower;public String getCompany() {return company;}public void setCompany(String company) {this.company = company;}public String getHorsePower() {return horsePower;}public void setHorsePower(String horsePower) {this.horsePower = horsePower;}@Overridepublic String toString() {return "Prduct [company=" + company + ", horsePower=" + horsePower+ "]";}} import java.util.List;public class Show {private String address; //車展的地址private String time; //車展時間private List<Car> cars; // 對象名要跟String中一樣public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getTime() {return time;}public void setTime(String time) {this.time = time;}public List<Car> getCars() {return cars;}public void setCars(List<Car> cars) {this.cars = cars;}@Overridepublic String toString() {return "Show [address=" + address + ", time=" + time + ", cars=" + cars+ "]";}} import java.util.List;import com.google.gson.Gson; import com.google.gson.reflect.TypeToken;public class goson1 {public static void main(String[] args) {// 解析對象jsonString json = "{brand:'寶馬',color:'red',price:150,engine:{company:'華為',horsePower:'400'}}";Gson gson = new Gson();Car c = gson.fromJson(json, Car.class);System.out.println(c);// 解析數組jsonString json2 = "[{brand:'寶馬',color:'red',price:150},{brand:'路虎',color:'black',price:180},{brand:'法拉利',color:'yellow',price:200}]";TypeToken<List<Car>> typeToken = new TypeToken<List<Car>>() {};List<Car> list = gson.fromJson(json2, typeToken.getType());System.out.println(list);// 混合型 String json3 ="{address:'深圳灣體育館',time:'2016-10-1',cars:[{brand:'寶馬',color:'red',price:150},{brand:'路虎',color:'black',price:180},{brand:'法拉利',color:'yellow',price:200}]}";Show show = gson.fromJson(json3, Show.class);System.out.println(show);}} public static void main(String[] args) {//解析對象jsonString json = "{brand:'寶馬',color:'red',price:150,engine:{company:'華為',horsePower:'400'}}";Gson gson = new Gson();Car c = gson.fromJson(json, Car.class);System.out.println(c);//解析數組jsonString json2 = "[{brand:'寶馬',color:'red',price:150},{brand:'路虎',color:'black',price:180},{brand:'法拉利',color:'yellow',price:200}]";TypeToken<List<Car>> typeToken = new TypeToken<List<Car>>(){};List<Car> list = gson.fromJson(json2, typeToken.getType());System.out.println(list);//混合型String json3 = "{address:'深圳灣體育館',time:'2016-10-1',cars:[{brand:'寶馬',color:'red',price:150},{brand:'路虎',color:'black',price:180},{brand:'法拉利',color:'yellow',price:200}]}";Show show =gson.fromJson(json3, Show.class);System.out.println(show);}通過以上代碼我們發現Gson的解析異常方便 這里總結下它的用法:
Gson 是 Google 提供的用來在 Java 對象和 JSON 數據之間進行映射的 Java 類庫。可以將一個 JSON 字符串轉成一個 Java 對象,或者反過來。 需要jar包:> **用法:**Gson gson=new Gson()1) fromJson(String json,Class<T>.class)把JSON轉成對應的對象【注意】:類和屬性和json的鍵要對應2) fromJson(String json,new TypeToken<List<Person>>() {}.getType())把JSON轉成集合3) toJson(Object obj) 把任何對象轉成JSON使用Gson要注意的一點,這里的list集合的車集合對象名一定要和要解析的json數據對應否則list將獲取不到數據比如這里的:
private List<Car> cars ; //對象名要跟String中一樣FAST-JSON
那么講完JSON GSON解析,下面講解下阿里云提供的API FASTJSON
先看他的方法
Fastjson API入口類是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON類上的靜態方法直接完成。// 把JSON文本parse為JavaBean public static final <T> T parseObject(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合 public static final <T> List<T> parseArray(String text, Class<T> clazz);// 將JavaBean序列化為JSON文本 public static final String toJSONString(Object object);我們發現這里的方法都是靜態的所以我們不需要創建fastjson對象直接類名.方法調用 ,當然它的用法跟Gson累死不夠效率卻高了許多,至于內部實現暫時不研究。。。
具體的用法讀者可自行研究一下。今天的分享就到此~
總結
以上是生活随笔為你收集整理的Json、Gson、FAST-JSON解析学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pull和SAX解析XML,以解析中国省
- 下一篇: 安卓开发之路-浅识Android