本文主要介紹Json資料的解析
----a,json資料的介紹
----b,json資料的解析
----c,gson資料的解析,谷歌公司的一種格式
----d,fastjson資料的解析,阿裡巴巴的一種格式
通過本文的學習能掌握json資料格式的解析,為以後json格式資料的解析做到熟練于心。
Json的全稱:JavaScript Object Notation
JSON的定義:
一種輕量級的資料交換格式,具有良好的可讀和便于快速編寫的特性。業内主流技術為其提供了完整的解決方案(有點類似于正規表達式 ,獲得了當今大部分語言的支援),進而可以在不同平台間進行資料交換。JSON采用相容性很高的文本格式,同時也具備類似于C語言體系的行為。 – Json.org
Json建構于兩種結構:
“名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被了解為對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵清單(keyed list),或者關聯數組 (associative array)。
值的有序清單(An ordered list of values)。在大部分語言中,它被了解為數組(array)
JSON對象是一個無序的“‘名稱/值’對”集合。
一個對象以“{”(左括号)開始,“}”(右括号)結束。
每個“名稱”後跟一個“:”(冒号);“‘名稱/值’ 對”之間使用“,”(逗号)分隔。
如: {
“name”:”jackson”,
“age”:100
}
數組是值(value)的有序集合。一個數組以“[”(左中括号)開始,“]”(右中括号)結束。值之間使用“,”(逗号)分隔
如:{
“students”:
[
{“name”:”jackson”,“age”:100},
{“name”:”michael”,”age”:51}
]
}
一。谷歌GSON技術的介紹
Gson這個Java類庫可以把Java對象轉換成JSON,也可以把JSON字元串轉換成一個相等的Java對象。
Gson支援任意複雜Java對象包括沒有源代碼的對象。
二。阿裡巴巴FastJson技術的介紹
FastJson是一個Json處理工具包,包括“序列化”和“反序列化”兩部分,它具備如下特征:
速度最快,測試表明,fastjson具有極快的性能,超越任其他的Java Json parser。包括自稱最快的JackJson。
功能強大,完全支援Java Bean、集合、Map、日期、Enum,支援範型,支援自省。
無依賴,能夠直接運作在Java SE 5.0以上版本
支援Android。
開源 (Apache 2.0)
三。JSON Vs XML
1.JSON和XML的資料可讀性基本相同
2.JSON和XML同樣擁有豐富的解析手段
3.JSON相對于XML來講,資料的體積小
4.JSON與JavaScript的互動更加友善
5.JSON對資料的描述性比XML較差
6.JSON的速度要遠遠快于XML
四。android2.3提供的json解析類
android的json解析部分都在包org.json下,主要有以下幾個類:
JSONObject:可以看作是一個json對象,這是系統中有關JSON定義的基本單元,其包含一對兒(Key/Value)數值。它對外部(External: 應用toString()方法輸出的數值)調用的響應展現為一個标準的字元串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的Key和Value被冒号":"分隔)。其對于内部(Internal)行為的操作格式略微,例如:初始化一個JSONObject執行個體,引用内部的put()方法添加數值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之間是以逗号","分隔。Value的類型包括:Boolean、JSONArray、JSONObject、Number、String或者預設值JSONObject.NULL object 。
JSONStringer:json文本建構類 ,根據官方的解釋,這個類可以幫助快速和便捷的建立JSON text。其最大的優點在于可以減少由于 格式的錯誤導緻程式異常,引用這個類可以自動嚴格按照JSON文法規則(syntax rules)建立JSON text。每個JSONStringer實體隻能對應建立一個JSON text。。其最大的優點在于可以減少由于格式的錯誤導緻程式異常,引用這個類可以自動嚴格按照JSON文法規則(syntax rules)建立JSON text。每個JSONStringer實體隻能對應建立一個JSON text。
JSONArray:它代表一組有序的數值。将其轉換為String輸出(toString)所表現的形式是用方括号包裹,數值以逗号”,”分隔(例如: [value1,value2,value3],大家可以親自利用簡短的代碼更加直覺的了解其格式)。這個類的内部同樣具有查詢行為, get()和opt()兩種方法都可以通過index索引傳回指定的數值,put()方法用來添加或者替換數值。同樣這個類的value類型可以包括:Boolean、JSONArray、JSONObject、Number、String或者預設值JSONObject.NULL object。
JSONTokener:json解析類
JSONException:json中用到的異常
首先建立一個公共的Bean
package com.qianfeng.domain;
public class Person {
private int age;
private String name;
public Person(int age, String name) {
super();
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person() {
// TODO Auto-generated constructor stub
}
}
第一種方式:
Json方式:
public class JsonList {
public JsonList() {
// TODO Auto-generated constructor stub
}
public static List<Person> getList() {
List<Person> list = new ArrayList<Person>();
list.add(new Person(1002,"李四2"));
list.add(new Person(1003,"李四3"));
list.add(new Person(1001,"李四1"));
return list;
}
public static Person getPerson(){
return new Person(1002,"李四2");
}
}
import net.sf.json.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
public class JsonTools {
public JsonTools() {
// TODO Auto-generated constructor stub
}
public static String getString(Person person) {
JSON json = JSONSerializer.toJSON(JsonList.getPerson());
return json.toString();
}
/**
*
* @param msgString
* @return
*/
public static Person getPerson(String msgString) {
Person person = new Person();
JSONArray array = new JSONArray();
array.add(msgString);
JSONObject obj = array.getJSONObject(0);
// System.out.println(obj.get("age"));
// System.out.println(obj.get("name"));
person.setAge(obj.getInt("age"));
person.setName(obj.getString("name"));
return person;
}
public static String getListString(List<Person> listPersons) {
JSON json = JSONSerializer.toJSON(listPersons);
return json.toString();
}
/**
* 将一個json格式的字元串轉換成行對應的對象
* @param str
* @return
*/
public static List<Person> getPersons(String str) {
List<Person> list = new ArrayList<Person>();
JSONArray array = new JSONArray();
array.add(str);
JSONArray array2 = array.getJSONArray(0);
for (int i = 0; i <array2.size(); i++) {
JSONObject jsonObject = array2.getJSONObject(i);
Person person = new Person();
person.setAge(jsonObject.getInt("age"));
person.setName(jsonObject.getString("name"));
list.add(person);
}
return list;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// JSON json = JSONSerializer.toJSON(JsonList.getList());
// System.out.println(getString(new Person(23,"jack")));
// System.out.println(getPerson("{'age':1002,'name':'李四2'}").toString());
// System.out.println(getListString(JsonList.getList()));
String msgString = "[{'age':1002,'name':'李四2'},{'age':1003,'name':'李四3'},{'age':1001,'name':'李四1'}]";
List<Person> lPersons = getPersons(msgString);
for(Person p:lPersons){
System.out.println(p.toString());
}
}
}
第二種方式:
Gson方式
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.android.domain.Person;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class GsonTools {
public GsonTools() {
// TODO Auto-generated constructor stub
}
public static String createGsonString(Object object) {
Gson gson = new Gson();
String gsonString = gson.toJson(object);
return gsonString;
}
public static <T> T changeGsonToBean(String gsonString, Class<T> cls) {
Gson gson = new Gson();
T t = gson.fromJson(gsonString, cls);
return t;
}
public static <T> List<T> changeGsonToList(String gsonString, Class<T> cls) {
Gson gson = new Gson();
List<T> list_person = gson.fromJson(gsonString,
new TypeToken<List<T>>() {
}.getType());
return list_person;
}
public static List<Map<String, Object>> changeGsonToListMaps(String gsonString) {
List<Map<String, Object>> list = null;
Gson gson = new Gson();
list = gson.fromJson(gsonString,
new TypeToken<List<Map<String, Object>>>() {
}.getType());
return list;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// Person person1 = new Person("張三1", 24, "北京1");
// Person person2 = new Person("張三2", 23, "北京2");
// List<Person> list = new ArrayList<Person>();
// list.add(person1);
// list.add(person2);
//
// String gsonString = createGsonString(list);
// System.out.println(gsonString);
// Gson gson = new Gson();
// List<Person> list_person = changeGsonToList(gsonString,Person.class);
// System.out.println(list_person.toString());
// Person pp = changeGsonToBean(gsonString,Person.class);
// System.out.println(pp);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "jack");
map.put("age", 23);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("name", "rose");
map2.put("age", 24);
list.add(map);
list.add(map2);
String gsonString = createGsonString(list);
System.out.println(gsonString);
List<Map<String, Object>> list2 = changeGsonToListMaps(gsonString);
System.out.println(list2.toString());
}
}
第三種方式:
fastJosn方式
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.asm.Type;
import com.alibaba.fastjson.util.TypeUtils;
public class FastJsonTools {
public FastJsonTools() {
// TODO Auto-generated constructor stub
}
public static String createJsonString(Object object) {
String jsonString = JSON.toJSONString(object);
return jsonString;
}
public static <T> T createJsonBean(String jsonString, Class<T> cls) {
T t = JSON.parseObject(jsonString, cls);
return t;
}
public static <T> List<T> createJsonToListBean(String jsonString,
Class<T> cls) {
List<T> list = null;
list = JSON.parseArray(jsonString, cls);
return list;
}
/**
* @param jsonString
* @return
*/
public static List<Map<String, Object>> createJsonToListMap(
String jsonString) {
List<Map<String, Object>> list2 = JSON.parseObject(jsonString,
new TypeReference<List<Map<String, Object>>>() {
});
return list2;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// Person person1 = new Person("張三1", 24, "北京1");
// Person person2 = new Person("張三2", 23, "北京2");
// List<Person> list = new ArrayList<Person>();
// list.add(person1);
// list.add(person2);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "jack");
map.put("age", 23);
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("name", "rose");
map2.put("age", 24);
list.add(map);
list.add(map2);
String jsonString = JSON.toJSONString(list);
System.out.println(jsonString);
// JSON.parseArray(arg0, arg1)
List<Map<String, Object>> list2 = JSON.parseObject(jsonString,
new TypeReference<List<Map<String, Object>>>() {
});
// List<Person> lists = JSON.parseArray(arg0, arg1);
System.out.println(list2.toString());
}
}
示例下載下傳
示例下載下傳
參考網址
json官網
google-gson
部落格一
=======================================================================================================================
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
/**
* 擷取"數組形式"的JSON資料,
* @param path 網頁路徑
* @return 傳回JSONArray
* @throws Exception
*/
public static String getJSONArray(String path) throws Exception {
String json = null;
URL url = new URL(path);
// 利用HttpURLConnection對象,我們可以從網絡中擷取網頁資料.
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 機關是毫秒,設定逾時時間為5秒
conn.setConnectTimeout(5 * 1000);
// HttpURLConnection是通過HTTP協定請求path路徑的,是以需要設定請求方式,可以不設定,因為預設為GET
conn.setRequestMethod("GET");
if (conn.getResponseCode() == 200) {// 判斷請求碼是否是200碼,否則失敗
InputStream is = conn.getInputStream(); // 擷取輸入流
byte[] data = readStream(is); // 把輸入流轉換成字元數組
json = new String(data); // 把字元數組轉換成字元串
// JSONArray jsonArray = new JSONArray(json);// 用android提供的架構JSONArray讀取JSON資料,轉換成Array
}
return json;
}
該方法傳回解析到的json資料(例:[{"ID":11,"uid":67,"carNo":"豫A000V1"},{"ID":12,"uid":67,"carNo":"豫A9E592"},{"ID":16,"uid":67,"carNo":"豫A1E238"}])
然後就可以解析你想要的字段了
JSONArray jsonArray = new JSONArray(carIdJSON);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
jsonObject.getString("carNo");
jsonObject.getString("ID");
}
有解析就有上傳了(POST上傳),json的上傳要用NameValuePairs,大家可以檢視jdk關于NameValuePairs的解釋
NameValuePairs隻能傳String類型的值
- nameValuePairs.add(new BasicNameValuePair("xxx", xxx));
複制代碼 可以上傳很多字段(按需求上傳就行了)
下面就是上傳的方法
- // 1. 使用POST方式時,傳遞參數必須使用NameValuePair數組
- // 2. 使用GET方式時,通過URL傳遞參數,注意寫法
- // 3. 通過setEntity方法來發送HTTP請求
- // 4. 通過DefaultHttpClient 的 execute方法來擷取HttpResponse
- // 5. 通過getEntity()從Response中擷取内容
- public static int httpPostData(String urlString,List<NameValuePair> nameValuePairs){
- HttpClient httpclient = new DefaultHttpClient();
- HttpPost httppost = new HttpPost(urlString);
- try{
- httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
- HttpResponse response = httpclient.execute(httppost);
- int statusCode = response.getStatusLine().getStatusCode();
- return statusCode;
- }catch(Exception e){
- e.printStackTrace();
- }
- return 0;
- }
複制代碼 方法傳回請求伺服器,傳回的響應參數
200成功
200伺服器出錯
404伺服器沒響應(伺服器有問題)
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=165428&reltid=227908&pre_thread_id=0&pre_pos=2&ext=CB
http://www.eoeandroid.com/forum.php?mod=viewthread&tid=276713