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));//下兩個字元
JsonReader
這裡的 JsonReader
是指 android.util
包下的,不是 gson
中的。可以直接參考它官方的 demo 。
假設有一段這樣的 json
輸入流:
[
{
"id": 912345678901,
"text": "How do I read JSON on Android?",
"geo": null,
"user": {
"name": "android_newb",
"followers_count": 41
}
},
{
"id": 912345678902,
"text": "@android_newb just use android.util.JsonReader!",
"geo": [
50.454722,
-104.606667
],
"user": {
"name": "jesse",
"followers_count": 2
}
}
]
使用 JsonReader
解析上述 json
:
public List<Message> readJsonStream(InputStream in) throws IOException {
JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
try {
return readMessagesArray(reader);
}
finally {
reader.close();
}
}
public List<Message> readMessagesArray(JsonReader reader) throws IOException {
List<Message> messages = new ArrayList<Message>();
reader.beginArray();
while (reader.hasNext()) {
messages.add(readMessage(reader));
}
reader.endArray();
return messages;
}
public Message readMessage(JsonReader reader) throws IOException {
long id = -1;
String text = null;
User user = null;
List<double> geo = null;
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("id")) {
id = reader.nextlong();
} else if (name.equals("text")) {
text = reader.nextString();
} else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
geo = readDoublesArray(reader);
} else if (name.equals("user")) {
user = readUser(reader);
} else {
reader.skipValue();
}
}
reader.endObject();
return new Message(id, text, user, geo);
}
public List<double> readDoublesArray(JsonReader reader) throws IOException {
List<double> doubles = new ArrayList<double>();
reader.beginArray();
while (reader.hasNext()) {
doubles.add(reader.nextdouble());
}
reader.endArray();
return doubles;
}
public User readUser(JsonReader reader) throws IOException {
String username = null;
int followersCount = -1;
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("name")) {
username = reader.nextString();
} else if (name.equals("followers_count")) {
followersCount = reader.nextint();
} else {
reader.skipValue();
}
}
reader.endObject();
return new User(username, followersCount);
}
關於上述方法的詳細介紹請參閱JsonReader。
JsonWriter
這裡的 JsonWriter
是指 android.util
包下的,不是 gson
中的。可以直接參考它官方的 demo 。
假設有一段這樣的 json
輸入流:
[
{
"id": 912345678901,
"text": "How do I write JSON on Android?",
"geo": null,
"user": {
"name": "android_newb",
"followers_count": 41
}
},
{
"id": 912345678902,
"text": "@android_newb just use android.util.JsonWriter!",
"geo": [
50.454722,
-104.606667
],
"user": {
"name": "jesse",
"followers_count": 2
}
}
]
使用 JsonWriter
編寫上述 json
:
public void writeJsonStream(OutputStream out, List<Message> messages) throws IOException {
JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
writer.setIndent(" ");
writeMessagesArray(writer, messages);
writer.close();
}
public void writeMessagesArray(JsonWriter writer, List<Message> messages) throws IOException {
writer.beginArray();
for (Message message : messages) {
writeMessage(writer, message);
}
writer.endArray();
}
public void writeMessage(JsonWriter writer, Message message) throws IOException {
writer.beginObject();
writer.name("id").value(message.getId());
writer.name("text").value(message.getText());
if (message.getGeo() != null) {
writer.name("geo");
writeDoublesArray(writer, message.getGeo());
} else {
writer.name("geo").nullValue();
}
writer.name("user");
writeUser(writer, message.getUser());
writer.endObject();
}
public void writeUser(JsonWriter writer, User user) throws IOException {
writer.beginObject();
writer.name("name").value(user.getName());
writer.name("followers_count").value(user.getFollowersCount());
writer.endObject();
}
public void writeDoublesArray(JsonWriter writer, List<double> doubles) throws IOException {
writer.beginArray();
for (double value : doubles) {
writer.value(value);
}
writer.endArray();
}
關於上述方法的詳細介紹請參閱JsonWriter。
相關文章
- android解析HashMap格式的jsonAndroidHashMapJSON
- android使用Gson來解析jsonAndroidJSON
- 手寫javascript json解析器JavaScriptJSON
- 自己動手寫json解析器0x01-分詞JSON分詞
- 使用Android sdk自帶的jsonReader來解析jsonAndroidJSON
- 手寫Json解析器學習心得JSON
- 通過Go來分析和建立JSONGoJSON
- 原創:struts2+json+android整合開發解析前奏JSONAndroid
- Oracle 12c 手動建立CDB和非CDBOracle
- Flutter json解析json_serializable的使用及自動化生成模板FlutterJSON
- Android開發 - inflate方法與建立檢視解析Android
- Exercise:JSON解析JSON
- cJSON:解析JSONJSON
- js json解析JSON
- 《手寫Mybatis》第5章:資料來源的解析、建立和使用MyBatis
- 原創:struts2+json+android開發整合解析終結JSONAndroid
- 將物件解析為JSON資料和將JSON資料解析為物件的簡單例項物件JSON單例
- Android studio 無法建立layout_land檔案解析Android
- React Native JSON解析和輔助函式(2)React NativeJSON函式
- Golang 流式解析 JsonGolangJSON
- 用JS解析JSONJSON
- java解析json listJavaJSON
- Swift iOS : 解析jsonSwiftiOSJSON
- json解析模組JSON
- Python JSON 使用指南:解析和轉換資料PythonJSON
- 自己手動建立https證書HTTP
- Android 沉浸式解析和輪子使用Android
- Flutter 中的 JSON 解析FlutterJSON
- oracle json 解析函式OracleJSON函式
- Spark Structured Streaming 解析 JSONSparkStructJSON
- ajax解析json物件集合JSON物件
- 解析大資料json大資料JSON
- Android開發 - Creator 類從 Parcel 中建立新的物件解析Android物件
- 【Android】【init】解析init程式啟動過程Android
- [譯] 如何建立 BubblePicker – Android 多彩選單動畫Android動畫
- Golang 學習——error 和建立 error 原始碼解析GolangError原始碼
- linux下json解析神器----jqLinuxJSON
- Python中解析json資料PythonJSON
- Flutter開發之JSON解析FlutterJSON