android解析JSON數(shù)據(jù)
JSONObject的使用
一、 JSON對(duì)象的使用:
String content = "{'username': 'linux', 'password': '123456'}";
JSONObject jsonObject = new JSONObject(content);
String username = jsonObject.getString("username");
String password = jsonObject.getString("password");
二、 JSON數(shù)組的使用:
String jsonContent = "[{'user': '劉力', 'age': 21, 'femal': true}, "
+ "{'user': 'chen', 'age': 20, 'femal': false}]";
JSONArray jsonArray = new JSONArray(jsonContent);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
System.out.print(object.getString("user") + " ");
System.out.print(object.getInt("age") + " ");
System.out.print(object.getBoolean("femal") + " ");
System.out.println();
}
三、 JSON數(shù)組與JSON對(duì)象混合使用
String jsonString = "[{'user': 'tomhu', 'age': 21, " + "'info': {'adress': 'hubai', 'sex': 'femal'}}, "
+ "{'user': 'chen', 'age': 20, " + "'info': {'adress': 'hunan', 'sex': 'male'}}]";
JSONArray jsonArrays = new JSONArray(jsonString);
for (int i = 0; i < jsonArrays.length(); i++) {
JSONObject objects = jsonArrays.getJSONObject(i);
System.out.print(objects.getString("user") + " ");
System.out.print(objects.getInt("age") + " ");
System.out.print(objects.getJSONObject("info").getString("adress") + " ");
System.out.print(objects.getJSONObject("info").getString("sex") + " ");
System.out.println();
}
四、 JSON數(shù)組中存儲(chǔ)對(duì)象
Person person = new Person();
person.setUsername("linux" );
person.setPassword("123456" );
JSONArray jsonArray = new JSONArray();
jsonArray.put(0, person );
jsonArray.put(1, "I love you" );
// String username = jsonArray.getJSONObject(0).getString("username"); 錯(cuò)誤的寫法
Person user = (Person) jsonArray.get(0);
System.out.println("username: " + user.getUsername());
JSONObject的原理
JsonObject的存儲(chǔ)與取出
一、 JSONObject里面維護(hù)了一個(gè)LinkedHashMap,當(dāng)生成一個(gè)無(wú)參數(shù)的JSONObject,實(shí)質(zhì)是初始化了一個(gè)Map:
private final LinkedHashMap<String, Object> nameValuePairs;
public JSONObject() {
nameValuePairs = new LinkedHashMap<String, Object>();
}
二、 當(dāng)JSONObject增加數(shù)據(jù),實(shí)質(zhì)上把數(shù)據(jù)的鍵值對(duì)方法存放在上述的Map中:
public JSONObject put(String name, boolean value) throws JSONException {
nameValuePairs.put(checkName(name), value);
return this;
}
三、 從JSONObject中取出數(shù)據(jù),很容易想到的就是從Map取出了:
public String getString(String name) throws JSONException {
Object object = get(name); // get()方法就是執(zhí)行Object result = nameValuePairs.get(name);
String result = JSON.toString(object);
if (result == null) {
throw JSON.typeMismatch(name, object, "String");
}
return result;
}
JsonObject的解析過(guò)程
一、 JsonObject還有一個(gè)帶參數(shù)的構(gòu)造函數(shù):常用的是傳遞一個(gè)String類型的參數(shù)
public JSONObject(String json) throws JSONException {
this(new JSONTokener(json));
}
二、 跟進(jìn)去,發(fā)現(xiàn)主要執(zhí)行的是JSONTokener的nextValue()方法,在這個(gè)方法中主要是對(duì)數(shù)據(jù)進(jìn)行解析;
public Object nextValue() throws JSONException {
int c = nextCleanInternal();
switch (c) {
case -1:
throw syntaxError("End of input");
case '{':
return readObject();
case '[':
return readArray();
case '\'':
case '"':
return nextString((char) c);
default:
pos--;
return readLiteral();
}
}
在nextCleanInternal方法中,它會(huì)從頭到尾的逐個(gè)字符的解析,對(duì)于一些字符做一些處理。例如空格,換行,轉(zhuǎn)義符等!
當(dāng)解析到[表示開始一個(gè)對(duì)象的讀取,當(dāng)解析到{表示一個(gè)數(shù)組的讀取
三、 在readObject方法中,仍然是調(diào)用nextCleanInternal()方法,逐個(gè)得到解析的字符,下到解析到}.下面貼出重要代碼
int first = nextCleanInternal(); // 得到解析的字符
if (first == '}') {
return result;
} else if (first != -1) {
pos--;
}
.......
while (true) {
Object name = nextValue(); // 解析得到鍵
int separator = nextCleanInternal();
if (separator != ':' && separator != '=') {
throw syntaxError("Expected ':' after " + name);
}
if (pos < in.length() && in.charAt(pos) == '>') {
pos++;
}
result.put((String) name, nextValue()); // 將解析得到的鍵值對(duì),存放在map當(dāng)中
switch (nextCleanInternal()) {
case '}':
return result;
case ';':
case ',':
continue;
default:
throw syntaxError("Unterminated object");
}
}
四、 nextValue方法比較關(guān)鍵,它流轉(zhuǎn)解析的大部分工作!在nextValue中有一個(gè)readLiteral方法,針對(duì)一些類型做處理,得到解析之后的結(jié)果:
private Object readLiteral() throws JSONException {
String literal = nextToInternal("{}[]/\\:,=;# \t\f");
if (literal.length() == 0) {
throw syntaxError("Expected literal value");
} else if ("null".equalsIgnoreCase(literal)) {
return JSONObject.NULL;
} else if ("true".equalsIgnoreCase(literal)) {
return Boolean.TRUE;
} else if ("false".equalsIgnoreCase(literal)) {
return Boolean.FALSE;
}
/* try to parse as an integral type... */
if (literal.indexOf('.') == -1) {
int base = 10;
String number = literal;
if (number.startsWith("0x") || number.startsWith("0X")) {
number = number.substring(2);
base = 16;
} else if (number.startsWith("0") && number.length() > 1) {
number = number.substring(1);
base = 8;
}
try {
long longValue = Long.parseLong(number, base);
if (longValue <= Integer.MAX_VALUE && longValue >= Integer.MIN_VALUE) {
return (int) longValue;
} else {
return longValue;
}
} catch (NumberFormatException e) {
/*
* This only happens for integral numbers greater than
* Long.MAX_VALUE, numbers in exponential form (5e-10) and
* unquoted strings. Fall through to try floating point.
*/
}
}
/* ...next try to parse as a floating point... */
try {
return Double.valueOf(literal);
} catch (NumberFormatException ignored) {
}
/* ... finally give up. We have an unquoted string */
return new String(literal); // a new string avoids leaking memory
}
五、至于JSONArray的解析與JsonObject的解析過(guò)程是一樣的,它里面維護(hù)的是一個(gè)List:
private final List<Object> values;
public JSONArray(JSONTokener readFrom) throws JSONException {
Object object = readFrom.nextValue();
if (object instanceof JSONArray) {
values = ((JSONArray) object).values;
} else {
throw JSON.typeMismatch(object, "JSONArray");
}
}
Gson的使用
一、我們?cè)跍y(cè)試當(dāng)中先加入一個(gè)Person類,方便測(cè)試:
package com.tomhu.test;
public class Person {
private String name;
private int age;
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;
}
}
二、 gson把對(duì)象轉(zhuǎn)換成JSON格式
Gson gson = new Gson();
Person person = new Person();
person.setName("linux");
person.setAge(23);
String str = gson.toJson(person);
System.out.println(str);
打印結(jié)果: {"name":"linux","age":23}
三、 gson把json格式解析成對(duì)象
String jsonData = "{'name':'劉力','age':19}";
Person person = gson.fromJson(jsonData, Person.class);
System.out.println(person.getName() + ", " + person.getAge());
打印結(jié)果: 劉力, 19
四、 gson把List對(duì)象解析成Json格式:
Gson gson = new Gson();
List<Person> persons = new ArrayList<Person>();
for (int i = 0; i < 2; i++) {
Person p = new Person();
p.setName("name" + i);
p.setAge(i * 5);
persons.add(p);
}
String str = gson.toJson(persons);
System.out.println(str);
打印結(jié)果: [{"name":"name0","age":0},{"name":"name1","age":5}]
五、 gson把Json格式解析成List對(duì)象:
Gson gson = new Gson();
String str = "[{'name':'linux','age':10},{'name':'huhx','age':22}]";
List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());
for (int i = 0; i < ps.size(); i++) {
Person person = ps.get(i);
System.out.print("name: " + person.getName() + " age: " + person.getAge());
}
打印結(jié)果:name: linux age: 10 name: huhx age: 22
- Android編程簡(jiǎn)單解析JSON格式數(shù)據(jù)的方法示例
- Android使用OKHTTP解析JSON數(shù)據(jù)的實(shí)例代碼
- android JSON解析數(shù)據(jù) android解析天氣預(yù)報(bào)
- Android 中對(duì)JSON數(shù)據(jù)解析實(shí)例代碼
- Android解析json數(shù)據(jù)示例代碼(三種方式)
- Android編程實(shí)現(xiàn)根據(jù)經(jīng)緯度查詢地址并對(duì)獲取的json數(shù)據(jù)進(jìn)行解析的方法
- Android之解析JSON數(shù)據(jù)示例(android原生態(tài),F(xiàn)astJson,Gson)
- Android json數(shù)據(jù)解析詳解及實(shí)例代碼
- Android系列---JSON數(shù)據(jù)解析的實(shí)例
- Android利用Gson解析嵌套多層的Json的簡(jiǎn)單方法
- Android M(6.x)使用OkHttp包解析和發(fā)送JSON請(qǐng)求的教程
- Android解析JSON數(shù)據(jù)的方法分析
- Android json解析及簡(jiǎn)單例子
- Android中g(shù)son、jsonobject解析JSON的方法詳解
- Android解析json數(shù)組對(duì)象的方法及Apply和數(shù)組的三個(gè)技巧
- Android隨手筆記44之JSON數(shù)據(jù)解析
- Android學(xué)習(xí)筆記45之gson解析json
- android原生JSON解析實(shí)例
相關(guān)文章
Android實(shí)現(xiàn)二維碼掃描并登陸網(wǎng)頁(yè)
這篇文章主要介紹了Android實(shí)現(xiàn)二維碼掃描并登陸網(wǎng)頁(yè)的相關(guān)資料,需要的朋友可以參考下2016-05-05
Android手機(jī)號(hào)碼輸入框(滿11位自動(dòng)跳到下個(gè)輸入框)實(shí)例代碼
這篇文章主要介紹了Android手機(jī)號(hào)碼輸入框(滿11位自動(dòng)跳到下個(gè)輸入框)實(shí)例代碼,需要的朋友可以參考下2017-10-10
Android AsyncTask的缺陷和問(wèn)題總結(jié)
這篇文章主要介紹了Android AsyncTask的缺陷和問(wèn)題總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-03-03
Android WebView如何判斷是否滾動(dòng)到底部
大家好,本篇文章主要講的是Android WebView如何判斷是否滾動(dòng)到底部,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換效果
這篇文章主要介紹了Android中TabLayout結(jié)合ViewPager實(shí)現(xiàn)頁(yè)面切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Android中TelephonyManager用法實(shí)例
這篇文章主要介紹了Android中TelephonyManager用法,結(jié)合實(shí)例形式分析了TelephonyManager類的功能,使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-03-03
解析Android中實(shí)現(xiàn)滑動(dòng)翻頁(yè)之ViewFlipper的使用詳解
有一些場(chǎng)景,我們需要向用戶展示一系列的頁(yè)面。比如我們正在開發(fā)一個(gè)看漫畫的應(yīng)用,可能就需要向用戶展示一張一張的漫畫圖片,用戶使用手指滑動(dòng)屏幕,可以在前一幅漫畫和后一幅漫畫之間切換。這個(gè)時(shí)候ViewFlipper就是一個(gè)很好的選擇2013-05-05

