文章目錄
1. json格式介紹
1.1 json對象格式介紹
{"name": "jadyli", "gender": "male"}
對象表示爲鍵值對,數據由逗號分隔,花括號保存對象,使用雙引號包裹鍵名,使用冒號分隔鍵和值。如果值是String類型且含有雙引號或冒號,需要使用”\”轉義。
1.2 json數組格式介紹
[
{"name": "jadyli", "gender": "male"},
{"name": "sanqi", "gender": "male"}
]
這個應該算一個json對象allstudent,值是一個json數組,因此後面GSON和fastJson的parserArray是解析[]
{
"allstudent": [
{
"sex": "boy",
"age": 18,
"name": "feng",
"phone" : ["12345678", "87654321"],
"address": {
"street": "tianfu 3.",
"city": "chengdu",
"country": "china"
}
},
{
"sex": "girl",
"age": 20,
"name": "xiao yu",
"phone" : ["1111111", "11112222"],
"address": {
"street": "heming 3.",
"city": "dayi",
"country": "China"
}
}
]
}
2. google Gson解析
2.1 引入jar
android studio使用如下,源碼裏面直接使用
@app/build.gradle
dependencies {
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.2'
}
2.2 解析json對象 JsonObject
2.2.1 寫json文件
@assets/testjson.json
{
"sex": "boy",
"age": 18,
"name": "feng", //字符串
"phone" : ["12345678", "87654321"], //phone數組
"address": { //對象address class裏面有3個string
"street": "tianfu 3.",
"city": "chengdu",
"country": "china"
}
}
2.2.2 寫json對應的JavaBean文件
@JsonJavaBean.java
package com.mytest.util;
import java.util.Arrays;
public class JsonJavaBean {
private String name;
private int age;
private String sex;
private String[] phone;
private JsonJavaBeanAddress 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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String[] getPhone() {
return phone;
}
public void setPhone(String[] phone) {
this.phone = phone;
}
public JsonJavaBeanAddress getAddress() {
return address;
}
public void setAddress(JsonJavaBeanAddress address) {
this.address = address;
}
@Override
public String toString() {
return "JsonJavaBean{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", phone=" + Arrays.toString(phone) +
", address=" + address +
'}';
}
}
JsonJavaBeanAddress是JsonJavaBean的一個變量類
@JsonJavaBeanAddress.java
package com.mytest.util;
public class JsonJavaBeanAddress {
private String street;
private String country;
private String city;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "JsonJavaBeanAddress{" +
"street='" + street + '\'' +
", country='" + country + '\'' +
", city='" + city + '\'' +
'}';
}
}
2.2.3 google Gson jar解析
JsonTest解析的主要類,裏面有封裝泛型parserJsonByGson()
@JsonTest.java
package com.mytest.util;
import android.content.Context;
import android.util.Log;
import com.google.gson.Gson;
public class JsonTest {
private static final String TAG = JsonTest.class.getSimpleName();
public void testJson(Context context) {
String jsonString = getAssetsJson(context);
JsonJavaBean jsonBean = parserJsonByGson(jsonString, JsonJavaBean.class);
Log.d(TAG, "result data: " + jsonBean.toString());
Log.d(TAG, " data name: " + jsonBean.getName());
Log.d(TAG, " data phone length: " + jsonBean.getPhone().length + " phone[1]: " + jsonBean.getPhone()[1]);
Log.d(TAG, " data country: " + jsonBean.getAddress().getCountry());
}
//通過工具類得到json文件內容
public String getAssetsJson(Context context) {
return JsonGetUtils.getJson("testjson.json",context);
}
public <T> T parserJsonByGson(String jsonString, Class<T> classOfT) {
Gson mGson = new Gson();
return mGson.fromJson(jsonString, classOfT);
}
}
//工具類,讀取assets文件爲string
package com.mytest.util;
import android.content.Context;
import android.content.res.AssetManager;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class JsonGetUtils {
/**
* 讀取assets本地json
* @param fileName
* @param context
* @return
*/
public static String getJson(String fileName, Context context) {
//將json數據變成字符串
StringBuilder stringBuilder = new StringBuilder();
try {
//獲取assets資源管理器
AssetManager assetManager = context.getAssets();
//通過管理器打開文件並讀取
BufferedReader bf = new BufferedReader(new InputStreamReader(
assetManager.open(fileName)));
String line;
while ((line = bf.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
}
調用test方法
@MainActivity.java
//json相關測試
JsonTest jsonTest = new JsonTest();
jsonTest.testJson(this);
2.2.4 結果
11-29 09:00:17.572 4934 4934 D JsonTest: result data: JsonJavaBean{name='feng', age=18, sex='boy',
phone=[12345678, 87654321], address=JsonJavaBeanAddress{street='tianfu 3.', country='china', city='chengdu'}}
11-29 09:00:17.572 4934 4934 D JsonTest: data name: feng
11-29 09:00:17.572 4934 4934 D JsonTest: data phone length: 2 phone[1]: 87654321
11-29 09:00:17.572 4934 4934 D JsonTest: data country: china
2.3 解析Json數組 JsonArray
2.3.1 寫json文件
添加數組
{
"allstudent":[
{
"sex": "boy",
"age": 18,
"name": "feng",
"phone" : ["12345678", "87654321"],
"address": {
"street": "tianfu 3.",
"city": "chengdu",
"country": "china"
}
},
{
"sex": "girl",
"age": 20,
"name": "xiao yu",
"phone" : ["1111111", "11112222"],
"address": {
"street": "heming 3.",
"city": "dayi",
"country": "China"
}
},
{
"sex": "girl",
"age": 20,
"name": "xiao yu",
"phone" : ["1111111", "11112222"],
"address": {
"street": "heming 3.",
"city": "dayi",
"country": "China"
}
}
]
}
2.3.2 寫json對應的JavaBean文件
同2.2.2
2.3.3 google Gson jar解析
其他引用是一樣的,allstudent是jsonArray的名字,在json文件中
@JsonTest.java
public void testJsonArray(Context context) {
String jsonString = getAssetsJson(context);
JsonParser parser = new JsonParser();
JsonObject jsonObject = parser.parse(jsonString).getAsJsonObject();
List<JsonJavaBean> jsonBeanList = stringToList(jsonObject.get("allstudent").toString(), JsonJavaBean.class);
for(JsonJavaBean jsonBean : jsonBeanList) {
Log.d(TAG, "testJsonArray result data: " + jsonBean.toString());
Log.d(TAG, "testJsonArray data name: " + jsonBean.getName());
Log.d(TAG, "testJsonArray data phone length: " + jsonBean.getPhone().length + " phone[1]: " + jsonBean.getPhone()[1]);
Log.d(TAG, "testJsonArray data country: " + jsonBean.getAddress().getCountry());
}
}
/**
* 把json 字符串轉化成list
*
* @param json
* @param cls
* @param <T>
* @return
*/
public static <T> List<T> stringToList(String json, Class<T> cls) {
Gson gson = new Gson();
List<T> list = new ArrayList<T>();
JsonArray array = new JsonParser().parse(json).getAsJsonArray();
for (final JsonElement elem : array) {
list.add(gson.fromJson(elem, cls));
}
return list;
}
//json相關測試
JsonTest jsonTest = new JsonTest();
//jsonTest.testJson(this);
jsonTest.testJsonArray(this);
2.3.4 結果
Log如下:
JsonTest: testJsonArray result data: JsonJavaBean{name='feng', age=18, sex='boy', phone=[12345678, 87654321], address=JsonJavaBeanAddress{street='tianfu 3.', country='china', city='chengdu'}}
JsonTest: testJsonArray data name: feng
JsonTest: testJsonArray data phone length: 2 phone[1]: 87654321
JsonTest: testJsonArray data country: china
JsonTest: testJsonArray result data: JsonJavaBean{name='xiao yu', age=20, sex='girl', phone=[1111111, 11112222], address=JsonJavaBeanAddress{street='heming 3.', country='China', city='dayi'}}
JsonTest: testJsonArray data name: xiao yu
JsonTest: testJsonArray data phone length: 2 phone[1]: 11112222
JsonTest: testJsonArray data country: China
JsonTest: testJsonArray result data: JsonJavaBean{name='xiao yu', age=20, sex='girl', phone=[1111111, 11112222], address=JsonJavaBeanAddress{street='heming 3.', country='China', city='dayi'}}
JsonTest: testJsonArray data name: xiao yu
JsonTest: testJsonArray data phone length: 2 phone[1]: 11112222
JsonTest: testJsonArray data country: China
3. 阿里巴巴Fastjson框架解析
3.1 引入jar
具體參考github: https://github.com/alibaba/fastjson
compile 'com.alibaba:fastjson:1.2.61'
3.2 解析json對象 JsonObject
3.2.1 寫json文件
構造都是一樣的
{
"sex": "boy",
"age": 18,
"name": "feng",
"phone" : ["12345678", "87654321"],
"address": {
"street": "tianfu 3.",
"city": "chengdu",
"country": "china"
}
}
把json文件轉爲String,其實就是json的序列話,因爲String是基本類型就可以傳遞使用了
package com.mytest.util;
import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class JsonGetUtils {
/**
* 讀取assets本地json
* @param fileName
* @param context
* @return
*/
public static String getJson(String fileName, Context context) {
//將json數據變成字符串
StringBuilder stringBuilder = new StringBuilder();
try {
//獲取assets資源管理器
AssetManager assetManager = context.getAssets();
//通過管理器打開文件並讀取
BufferedReader bf = new BufferedReader(new InputStreamReader(
assetManager.open(fileName)));
String line;
while ((line = bf.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
Log.d("JsonGetUtils",fileName + " getJson:" + stringBuilder.toString());
return stringBuilder.toString();
}
}
3.2.2 寫json對應的JavaBean文件
構造的兩個javaBean class和GSON使用時一樣
JsonJavaBean.java
JsonJavaBeanAddress.java
3.2.3 fastjson jar解析
這個文件就是解析jsonObject的
@FastJsonByAlibaba.java
package com.mytest.util;
import android.content.Context;
import android.util.Log;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
public class FastJsonByAlibaba {
private static final String TAG = FastJsonByAlibaba.class.getSimpleName();
public void testJson(Context context) {
String jsonString = getAssetsJson(context);
JsonJavaBean javaBean = JSON.parseObject(jsonString, JsonJavaBean.class);
Log.d(TAG, "javaBean result :" + javaBean.toString());
}
//通過工具類得到json文件內容
public String getAssetsJson(Context context) {
return JsonGetUtils.getJson("testfastjson.json",context);
}
}
FastJsonByAlibaba fastJson = new FastJsonByAlibaba();
fastJson.testJson(this); //測試fastjson jsonObject解析
fastJson.testJsonByArray(this);//測試fastjson 解析數組
3.2.4 結果
JsonGetUtils: testfastjson.json getJson:{ "sex": "boy", "age": 18, "name": "feng", "phone" : ["12345678", "87654321"], "address": { "street": "tianfu 3.", "city": "chengdu", "country": "china" }}
FastJsonByAlibaba: javaBean result :JsonJavaBean{name='feng', age=18, sex='boy', phone=[12345678, 87654321], address=JsonJavaBeanAddress{street='tianfu 3.', country='china', city='chengdu'}}
3.3 解析Json數組 JsonArray
3.3.1 寫json文件
fastJsonArray.json和前面GSON裏的不一樣,這裏直接說[]開頭
[
{
"sex": "boy",
"age": 18,
"name": "feng",
"phone" : ["12345678", "87654321"],
"address": {
"street": "tianfu 3.",
"city": "chengdu",
"country": "china"
}
},
{
"sex": "girl",
"age": 20,
"name": "xiao yu",
"phone" : ["1111111", "11112222"],
"address": {
"street": "heming 3.",
"city": "dayi",
"country": "China"
}
},
{
"sex": "girl2",
"age": 20,
"name": "xiao yu",
"phone" : ["1111111", "11112222"],
"address": {
"street": "heming 3.",
"city": "dayi",
"country": "China"
}
}
]
3.3.2 寫json對應的JavaBean文件
同上
3.3.3 fastGson jar解析數組
parseArray要求json是以[開頭
package com.mytest.util;
import android.content.Context;
import android.util.Log;
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.List;
public class FastJsonByAlibaba {
private static final String TAG = FastJsonByAlibaba.class.getSimpleName();
//通過工具類得到json文件內容
public String getAssetsJsonArray(Context context) {
return JsonGetUtils.getJson("fastJsonArray.json",context);
}
public void testJsonByArray(Context context) {
String jsonString = getAssetsJsonArray(context);
List<JsonJavaBean> javaBean = new ArrayList<>();
javaBean = JSON.parseArray(jsonString, JsonJavaBean.class);
for(JsonJavaBean bean : javaBean) {
Log.d(TAG, "bean result :" + bean.toString());
}
}
}
3.3.4 結果
JsonGetUtils: fastJsonArray.json getJson:[ { "sex": "boy", "age": 18, "name": "feng", "phone" : ["12345678", "87654321"], "address": { "street": "tianfu 3.", "city": "chengdu", "country": "china" } }, { "sex": "girl", "age": 20, "name": "xiao yu", "phone" : ["1111111", "11112222"], "address": { "street": "heming 3.", "city": "dayi", "country": "China" } }, { "sex": "girl2", "age": 20, "name": "xiao yu", "phone" : ["1111111", "11112222"], "address": { "street": "heming 3.", "city": "dayi", "country": "China" } }]
FastJsonByAlibaba: bean result :JsonJavaBean{name='feng', age=18, sex='boy', phone=[12345678, 87654321], address=JsonJavaBeanAddress{street='tianfu 3.', country='china', city='chengdu'}}
FastJsonByAlibaba: bean result :JsonJavaBean{name='xiao yu', age=20, sex='girl', phone=[1111111, 11112222], address=JsonJavaBeanAddress{street='heming 3.', country='China', city='dayi'}}
FastJsonByAlibaba: bean result :JsonJavaBean{name='xiao yu', age=20, sex='girl2', phone=[1111111, 11112222], address=JsonJavaBeanAddress{street='heming 3.', country='China', city='dayi'}}
3.4 fastJson解析數組延伸
最外層定義了標籤 allstudent,需要解析allstudent裏面的json數組
{
"allstudent": [
{
"sex": "boy",
"age": 18,
"name": "feng",
"phone" : ["12345678", "87654321"],
"address": {
"street": "tianfu 3.",
"city": "chengdu",
"country": "china"
}
},
{
"sex": "girl",
"age": 20,
"name": "xiao yu",
"phone" : ["1111111", "11112222"],
"address": {
"street": "heming 3.",
"city": "dayi",
"country": "China"
}
},
{
"sex": "girl2",
"age": 20,
"name": "xiao yu",
"phone" : ["1111111", "11112222"],
"address": {
"street": "heming 3.",
"city": "dayi",
"country": "China"
}
}
]
}
解析時需要獲取key allstudent的內容,在調用parseArray解析纔可以
public void testJsonObject(Context context) {
String jsonString = getAssetsJsonArray(context);
JSONObject object = JSONObject.parseObject(jsonString);
String aString = object.getString("allstudent");
Log.d(TAG, "aString result :" + aString);
List<JsonJavaBean> javaBean = JSON.parseArray(aString, JsonJavaBean.class);
for(JsonJavaBean bean : javaBean) {
Log.d(TAG, "bean result :" + bean.toString());
}
}
從log看,getString之後的值是有重新排序的,已經不是原來的了
11-30 02:49:29.888 7423 7423 D JsonGetUtils: testjsonarray.json getJson:{ "allstudent": [ { "sex": "boy", "age": 18, "name": "feng", "phone" : ["12345678", "87654321"], "address": { "street": "tianfu 3.", "city": "chengdu", "country": "china" } }, { "sex": "girl", "age": 20, "name": "xiao yu", "phone" : ["1111111", "11112222"], "address": { "street": "heming 3.", "city": "dayi", "country": "China" } }, { "sex": "girl2", "age": 20, "name": "xiao yu", "phone" : ["1111111", "11112222"], "address": { "street": "heming 3.", "city": "dayi", "country": "China" } } ]}
11-30 02:49:29.905 7423 7423 D FastJsonByAlibaba: aString result :[{"address":{"country":"china","city":"chengdu","street":"tianfu 3."},"phone":["12345678","87654321"],"sex":"boy","name":"feng","age":18},{"address":{"country":"China","city":"dayi","street":"heming 3."},"phone":["1111111","11112222"],"sex":"girl","name":"xiao yu","age":20},{"address":{"country":"China","city":"dayi","street":"heming 3."},"phone":["1111111","11112222"],"sex":"girl2","name":"xiao yu","age":20}]
11-30 02:49:29.906 7423 7423 D FastJsonByAlibaba: bean result :JsonJavaBean{name='feng', age=18, sex='boy', phone=[12345678, 87654321], address=JsonJavaBeanAddress{street='tianfu 3.', country='china', city='chengdu'}}
11-30 02:49:29.906 7423 7423 D FastJsonByAlibaba: bean result :JsonJavaBean{name='xiao yu', age=20, sex='girl', phone=[1111111, 11112222], address=JsonJavaBeanAddress{street='heming 3.', country='China', city='dayi'}}
11-30 02:49:29.907 7423 7423 D FastJsonByAlibaba: bean result :JsonJavaBean{name='xiao yu', age=20, sex='girl2', phone=[1111111, 11112222], address=JsonJavaBeanAddress{street='heming 3.', country='China', city='dayi'}}
3.5 fastjson JSONObject轉換方法
//Java對象轉換成String類型的JSON字符串
JSONObject.toJSONString(Java對象)
//String類型的JSON字符串轉換成Java對象
JSONObject.toJavaObject(JSON字符串,Java對象.class)
//Json字符串轉換成JSONObject對象
JSONObject.parseObject(JSON字符串)
//JSON字符串轉換成Java對象
JSONObject.parseObject(JSON字符串,Java對象.class)