Android 創建和解析 Json

Android手動創建和解析Json

概述

現在Android開發中創建和解析Json大都是利用Gson、fastJson等可以映射對象的第三方庫,確實非常方便,使用Gson解析可以參考我的另一篇文章使用Gson解析和創建json, 但是還是有需要手動解析的情況。本文詳細介紹了不使用第三方庫,直接使用Android自帶的JsonObject等類來創建和解析json,並準備了一個小Demo.

1 json的格式介紹

1.1 json對象

{"name": "jadyli", "gender": "male"}

對象表示爲鍵值對,數據由逗號分隔,花括號保存對象,使用雙引號包裹鍵名,使用冒號分隔鍵和值。如果值是String類型且含有雙引號或冒號,需要使用”\”轉義。

1.2 json數組

[
    {"name": "jadyli", "gender": "male"},
    {"name": "sanqi", "gender": "male"}
]

方括號保存數組。

2 Android自帶的Json操作類

2.1 JSONObject

2.1.1 JSONObject基本介紹

Android官方的介紹是

A modifiable set of name/value mappings. Names are unique, non-null strings. Values may be any mix of JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL. Values may not be null, NaNs, infinities, or of any type not listed here.

一個可變更的鍵值對映射集合。鍵是唯一的,非空的字符串。值可能是JSONObjects,JSONArrays,Strings,Booleans,Integers,Longs,Double或NULL中的任意組合。值也有可能不是null,NaNs,infinities,或者任意的這裏沒有列舉的類型。

一些常用的方法如下,參考Android JSONObject類

方法名(參數) 描述
get(String name) 返回跟鍵映射的值,如果沒找到則拋出異常
getInt(String name) 返回int值,如果沒找到則拋出異常
getString(String name) 返回String值,如果沒找到則拋出異常
opt(String name) 返回跟鍵映射的值,如果沒找到則返回null
optString(String name, String fallback) 返回跟鍵映射的值,如果沒找到則返回方法參數中fallback
optString(String name) 返回跟鍵映射的值,如果沒找到則返回空字符串”“
put(String name, Object value) 將鍵映射到值,如果這個對象中存在這個鍵則會覆蓋之前的
put(String name, int value) 將鍵映射到值,如果這個對象中存在這個鍵則會覆蓋之前的
getJSONObject(String name) 返回JSONObject,如果沒找到則拋出異常
getJSONArray(String name) 返回JSONArray值,如果沒找到則拋出異常
keys() 返回Iterator,這個對象中鍵的集合迭代器
names() 返回JSONArray,這個對象中鍵的數組
length() 返回這個對象中數據條數
has(String name) 判斷這個對象中是否有這個鍵的映射
isNull(String name) 判斷這個對象中是否有這個鍵的映射,或者判斷值爲NULL
toString() 將這個對象轉成json串,比如:{“query”:”Pizza”,”locations”:[94043,90210]}
toString(int indentSpaces) 將這個對象轉成json串,顯示上會增加換行和縮進,方便閱讀

可以調用JSONObject()構造方法,創建一個空的JSONObject,也可以調用JSONObject(String json),將json字符串傳入。

2.1.2 JSONObject實例

運用上面的方法,已經可以解析和創建一般的json字符串了。以這個json字符串爲例。

{"name": "jadyli", "gender": "male", "age": 18}

創建json

JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "jadyli");
jsonObject.put("gender", "male");
jsonObject.put("age", 18);
System.out.println(jsonObject.toString(1));

輸出

{“name”:”jadyli”,”gender”:”male”,”age”:18}

解析json

String json = "{\"name\": \"jadyli\", \"gender\": \"male\", \"age\": 18}";
JSONObject jsonObject = new JSONObject(json);
System.out.println("姓名:" + jsonObject.getString("name"));
System.out.println("性別:" + jsonObject.getString("gender"));
System.out.println("年齡:" + jsonObject.getString("age"));

2.2 JSONArray

參考JSONArray
JSONArray的方法和JSONObject基本一致。舉個JSONObject和JSONArray同時使用的小例子。

{
  "students": [
    {
      "name": "jadyli",
      "gender": "male",
      "age": 18
    },
    {
      "name": "Juliet",
      "gender": "female",
      "age": 20
    }
  ]
}

創建json

String[] names = {"jadyli", "Juliet"};
String[] genders = {"male", "female"};
int[] ages = {18, 20};
JSONArray students = new JSONArray();
for (int i = 0; i < names.length; i++) {
    JSONObject student = new JSONObject();
    student.put("name", names[i]);
    student.put("gender", genders[i]);
    student.put("age", ages[i]);
    students.put(student);
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("students", students);
System.out.println(jsonObject.toString(1));

輸出

{“students”:[{“name”:”jadyli”,”gender”:”male”,”age”:18},{“name”:”Juliet”,”gender”:”female”,”age”:20}]}

解析json

String json = "{"students":[{"name":"jadyli","gender":"male","age":18},
                         {"name":"Juliet","gender":"female","age":20}]}";
JSONObject jsonObject = new JSONObject(json);
JSONArray students = jsonObject.getJSONArray("students");
for (int i = 0; i < students.length(); i++) {
     JSONObject student = students.getJSONObject(i);
     System.out.println("姓名:" + student.getString("name"));
     System.out.println("性別:" + student.getString("gender"));
     System.out.println("年齡:" + student.getInt("age") + "\n");
}


2.3 JSONStringer

方法參考JSONStringer
我們主要用這個類來創建json。

{
  "students": [
    {
      "name": "jadyli",
      "gender": "male",
      "age": 18
    },
    {
      "name": "Juliet",
      "gender": "female",
      "age": 20
    }
  ]
}

JSONStringer jsonStringer = new JSONStringer();
jsonStringer.object();

jsonStringer.key("students");
jsonStringer.array();
String[] names = {"jadyli", "Juliet"};
String[] genders = {"male", "female"};
int[] ages = {18, 20};
for (int i = 0; i < names.length; i++) {
    jsonStringer.object();
    jsonStringer.key("name");
    jsonStringer.value(names[i]);
    jsonStringer.key("gender");
    jsonStringer.value(genders[i]);
    jsonStringer.key("age");
    jsonStringer.value(ages[i]);
    jsonStringer.endObject();
}
jsonStringer.endArray();

jsonStringer.endObject();

System.out.println(jsonStringer.toString());

輸出

{“students”:[{“name”:”jadyli”,”gender”:”male”,”age”:18},{“name”:”Juliet”,”gender”:”female”,”age”:20}]}

2.4 JSONTokener

方法參考JSONTokener

這個類主要是用來解析json的。我們使用JSONTokener來解析一下下面的這個json。

{
  "students": [
    {
      "name": "jadyli",
      "gender": "male",
      "age": 18
    },
    {
      "name": "Juliet",
      "gender": "female",
      "age": 20
    }
  ]
}

JSONTokener jsonTokener = new JSONTokener("{\"students\":[" +
                            "{\"name\":\"jadyli\",\"gender\":\"male\",\"age\":18}," +
                            "{\"name\":\"Juliet\",\"gender\":\"female\",\"age\":20}]}");
JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
JSONArray students = jsonObject.getJSONArray("students");
for (int i = 0; i < students.length(); i++) {
     JSONObject student = students.getJSONObject(i);
     System.out.println("姓名:" + student.getString("name"));
     System.out.println("性別:" + student.getString("gender"));
     System.out.println("年齡:" + student.getInt("age") + "\n");
}

只是使用nextValue()將json讀成了JSONObject。
JSONTokener的主要作用是讀取json中的字符,一般不會用到。

System.out.println(jsonTokener.next()); //下一個字符
jsonTokener.skipPast("name"); //定位到name後面
System.out.println(jsonTokener.next(2));//下兩個字符


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