Android Json(3) -- Json的解析

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)

參考鏈接

1. Android項目之JSON解析(3種解析技術詳解)

2. Android手動創建和解析Json

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章