欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中的JSON詳細(xì)總結(jié)

 更新時(shí)間:2013年01月21日 11:50:28   作者:  
一種輕量級(jí)的數(shù)據(jù)交換格式,具有良好的可讀和便于快速編寫的特性。業(yè)內(nèi)主流技術(shù)為其提供了完整的解決方案(有點(diǎn)類似于正則表達(dá)式,獲得了當(dāng)今大部分語(yǔ)言的支持),從而可以在不同平臺(tái)間進(jìn)行數(shù)據(jù)交換
1、JSON(JavaScript ObjectNotation) 定義:
一種輕量級(jí)的數(shù)據(jù)交換格式,具有良好的可讀和便于快速編寫的特性。業(yè)內(nèi)主流技術(shù)為其提供了完整的解決方案(有點(diǎn)類似于正則表達(dá)式,獲得了當(dāng)今大部分語(yǔ)言的支持),從而可以在不同平臺(tái)間進(jìn)行數(shù)據(jù)交換。JSON采用兼容性很高的文本格式,同時(shí)也具備類似于C語(yǔ)言體系的行為。 – Json.org

2、JSON的結(jié)構(gòu):

(1) Name/Value Pairs(無(wú)序的):類似所熟知的Keyed list、 Hash table、Disctionary和Associative array。在Android平臺(tái)中同時(shí)存在另外一個(gè)類"Bundle",某種程度上具有相似的行為。

(2) Array(有序的):一組有序的數(shù)據(jù)列表。

對(duì)象
對(duì)象是一個(gè)無(wú)序的Name/Value Pairs集合。{ name:value, name:value , name:value .... }
例子:{"name":"小豬","age":20 }

Array
  Array是值(value)的有序集合。[ value , value , value ...... ]
  值(value)可以是雙引號(hào)括起來(lái)的字符串(string)、數(shù)值(number)、true、false、 null、對(duì)象(object)或者數(shù)組(array)。這些結(jié)構(gòu)可以嵌套。
  字符串(string)是由雙引號(hào)包圍的任意數(shù)量Unicode字符的集合,使用反斜線轉(zhuǎn)義。一個(gè)字符(character)即一個(gè)單獨(dú)的字符串(characterstring)。 例如:\ + " \/ b f n r t u 進(jìn)行轉(zhuǎn)義。
例子1: Array里面包含對(duì)象(object)
[{"id":1,"name":"小豬","age”:22} , {"id":2,"name":"小貓","age”:23}, .......]

例子2:同樣對(duì)象(object)中可以包含Array

(1)一個(gè)對(duì)象包含1個(gè)數(shù)組,2個(gè)子對(duì)象
{"root":[{"id":"001","name":"小豬"},{"id":"002","name":"小貓"},{"id":"003","name":"小狗"}],
"total":3,
"success":true
}

(2)也可以對(duì)象嵌套子對(duì)象,子對(duì)象再嵌套數(shù)組
{"calendar":
{"calendarlist":
[
{"id":"001","name":"小豬"},
{"id":"002","name":"小貓"}
]
}
}

總之,格式多種多樣,可以互相嵌套

在Android中包含四個(gè)與JSON相關(guān)的類和一個(gè)Exceptions:

JSONArray
JSONObject
JSONStringer
JSONTokener
JSONException

(1)JSONObject:

這是系統(tǒng)中有關(guān)JSON定義的基本單元,其包含一對(duì)兒(Key/Value)數(shù)值。
它對(duì)外部(External:應(yīng)用toString()方法輸出的數(shù)值)調(diào)用的響應(yīng)體現(xiàn)為一個(gè)標(biāo)準(zhǔn)的字符串(例如:{“JSON”:“Hello, World”},最外被大括號(hào)包裹,其中的Key和Value被冒號(hào)”:”分隔)。其對(duì)于內(nèi)部(Internal)行為的操作格式略微,例如:初始化一個(gè)JSONObject實(shí)例,引用內(nèi)部的put()方法添加數(shù)值:new JSONObject().put(“JSON”, “Hello, World!”),在Key和Value之間是以逗號(hào)”,”分隔。
Value的類型包括:Boolean、JSONArray、JSONObject、Number、String或者默認(rèn)值JSONObject.NULL object。
有兩個(gè)不同的取值方法:
get(): 在確定數(shù)值存在的條件下使用,否則當(dāng)無(wú)法檢索到相關(guān)Key時(shí),將會(huì)拋出一個(gè)Exception信息。
opt(): 這個(gè)方法相對(duì)比較靈活,當(dāng)無(wú)法獲取所指定數(shù)值時(shí),將會(huì)返回一個(gè)默認(rèn)數(shù)值,并不會(huì)拋出異常。

(2)JSONArray:

它代表一組有序的數(shù)值。將其轉(zhuǎn)換為String輸出(toString)所表現(xiàn)的形式是用方括號(hào)包裹,數(shù)值以逗號(hào)”,”分隔(例如:[value1,value2,value3],大家可以親自利用簡(jiǎn)短的代碼更加直觀的了解其格式)。這個(gè)類的內(nèi)部同樣具有查詢行為,get()和opt()兩種方法都可以通過(guò)index索引返回指定的數(shù)值,put()方法用來(lái)添加或者替換數(shù)值。
同樣這個(gè)類的value類型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默認(rèn)值JSONObject.NULLobject。

(3)JSONStringer:

根據(jù)官方的解釋,這個(gè)類可以幫助快速和便捷的創(chuàng)建JSONtext。其最大的優(yōu)點(diǎn)在于可以減少由于格式的錯(cuò)誤導(dǎo)致程序異常,引用這個(gè)類可以自動(dòng)嚴(yán)格按照J(rèn)SON語(yǔ)法規(guī)則(syntaxrules)創(chuàng)建JSON text。每個(gè)JSONStringer實(shí)體只能對(duì)應(yīng)創(chuàng)建一個(gè)JSON text。

根據(jù)下邊的實(shí)例來(lái)了解其它相關(guān)信息:

復(fù)制代碼 代碼如下:

String myString = new JSONStringer().object().key("name").value("小豬").endObject().toString();


如果是一組標(biāo)準(zhǔn)格式的JSON text:{"name" :"小豬"}

其中的.object()和.endObject()必須同時(shí)使用,是為了按照Object標(biāo)準(zhǔn)給數(shù)值添加邊界。同樣,針對(duì)數(shù)組也有一組標(biāo)準(zhǔn)的方法來(lái)生成邊界.array()和.endArray()。

(4)JSONTokener:

這個(gè)是系統(tǒng)為JSONObject和JSONArray構(gòu)造器解析JSONsource string的類,它可以從source string中提取數(shù)值信息。

JSONException:

是JSON.org類拋出的異常信息。
下面引用一個(gè)完整的應(yīng)用實(shí)例:
應(yīng)用JSONObject存儲(chǔ)Map類型數(shù)值:
復(fù)制代碼 代碼如下:

public static JSONObject getJSON(Map map) {
Iterator iter = map.entrySet().iterator();
JSONObject holder = new JSONObject();
while (iter.hasNext()) {
Map.Entry pairs = (Map.Entry) iter.next();
String key = (String) pairs.getKey();
Map m = (Map) pairs.getValue();
JSONObject data = new JSONObject();
try {
Iterator iter2 = m.entrySet().iterator();
while (iter2.hasNext()) {
Map.Entry pairs2 = (Map.Entry) iter2.next();
data.put((String) pairs2.getKey(), (String) pairs2
.getValue());
}
holder.put(key, data);
} catch (JSONException e) {
Log.e("Transforming", "There was an error packaging JSON", e);
}
}
return holder;
}

下面是詳細(xì)的例子:
復(fù)制代碼 代碼如下:

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
import android.util.Log;

public class JSON {

/**
* 獲取"數(shù)組形式"的JSON數(shù)據(jù),
* 數(shù)據(jù)形式:[{"id":1,"name":"小豬"},{"id":2,"name":"小貓"}]
* @param path 網(wǎng)頁(yè)路徑
* @return 返回List
* @throws Exception
*/
public static List<Map<String, String>> getJSONArray(String path) throws Exception {
String json = null;
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map = null;
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection對(duì)象,我們可以從網(wǎng)絡(luò)中獲取網(wǎng)頁(yè)數(shù)據(jù).
conn.setConnectTimeout(5 * 1000); // 單位是毫秒,設(shè)置超時(shí)時(shí)間為5秒
conn.setRequestMethod("GET"); // HttpURLConnection是通過(guò)HTTP協(xié)議請(qǐng)求path路徑的,所以需要設(shè)置請(qǐng)求方式,可以不設(shè)置,因?yàn)槟J(rèn)為GET
if (conn.getResponseCode() == 200) {// 判斷請(qǐng)求碼是否是200碼,否則失敗
InputStream is = conn.getInputStream(); // 獲取輸入流
byte[] data = readStream(is); // 把輸入流轉(zhuǎn)換成字符數(shù)組
json = new String(data); // 把字符數(shù)組轉(zhuǎn)換成字符串

//數(shù)據(jù)形式:[{"id":1,"name":"小豬","age":22},{"id":2,"name":"小貓","age":23}]
JSONArray jsonArray = new JSONArray(json); //數(shù)據(jù)直接為一個(gè)數(shù)組形式,所以可以直接 用android提供的框架JSONArray讀取JSON數(shù)據(jù),轉(zhuǎn)換成Array

for (int i = 0; i < jsonArray.length(); i++) {
JSONObject item = jsonArray.getJSONObject(i); //每條記錄又由幾個(gè)Object對(duì)象組成
int id = item.getInt("id"); // 獲取對(duì)象對(duì)應(yīng)的值
String name = item.getString("name");

map = new HashMap<String, String>(); // 存放到MAP里面
map.put("id", id + "");
map.put("name", name);
list.add(map);
}
}

// ***********測(cè)試數(shù)據(jù)******************
for (Map<String, String> list2 : list) {
String id = list2.get("id");
String name = list2.get("name");
Log.i("abc", "id:" + id + " | name:" + name);
}
return list;
}

/**
* 獲取"對(duì)象形式"的JSON數(shù)據(jù),
* 數(shù)據(jù)形式:{"total":2,"success":true,"arrayData":[{"id":1,"name":"小豬"},{"id":2,"name":"小貓"}]}
* @param path 網(wǎng)頁(yè)路徑
* @return 返回List
* @throws Exception
*/
public static List<Map<String, String>> getJSONObject(String path) throws Exception {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map = null;
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection對(duì)象,我們可以從網(wǎng)絡(luò)中獲取網(wǎng)頁(yè)數(shù)據(jù).
conn.setConnectTimeout(5 * 1000); // 單位是毫秒,設(shè)置超時(shí)時(shí)間為5秒
conn.setRequestMethod("GET"); // HttpURLConnection是通過(guò)HTTP協(xié)議請(qǐng)求path路徑的,所以需要設(shè)置請(qǐng)求方式,可以不設(shè)置,因?yàn)槟J(rèn)為GET
if (conn.getResponseCode() == 200) {// 判斷請(qǐng)求碼是否是200碼,否則失敗
InputStream is = conn.getInputStream(); // 獲取輸入流
byte[] data = readStream(is); // 把輸入流轉(zhuǎn)換成字符數(shù)組
String json = new String(data); // 把字符數(shù)組轉(zhuǎn)換成字符串


//數(shù)據(jù)形式:{"total":2,"success":true,"arrayData":[{"id":1,"name":"小豬"},{"id":2,"name":"小貓"}]}
JSONObject jsonObject=new JSONObject(json); //返回的數(shù)據(jù)形式是一個(gè)Object類型,所以可以直接轉(zhuǎn)換成一個(gè)Object
int total=jsonObject.getInt("total");
Boolean success=jsonObject.getBoolean("success");
Log.i("abc", "total:" + total + " | success:" + success); //測(cè)試數(shù)據(jù)

JSONArray jsonArray = jsonObject.getJSONArray("arrayData");//里面有一個(gè)數(shù)組數(shù)據(jù),可以用getJSONArray獲取數(shù)組
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject item = jsonArray.getJSONObject(i); // 得到每個(gè)對(duì)象
int id = item.getInt("id"); // 獲取對(duì)象對(duì)應(yīng)的值
String name = item.getString("name");

map = new HashMap<String, String>(); // 存放到MAP里面
map.put("id", id + "");
map.put("name", name);
list.add(map);
}
}

// ***********測(cè)試數(shù)據(jù)******************

for (Map<String, String> list2 : list) {
String id = list2.get("id");
String name = list2.get("name");
Log.i("abc", "id:" + id + " | name:" + name);
}
return list;
}


/**
* 獲取類型復(fù)雜的JSON數(shù)據(jù)
*數(shù)據(jù)形式:
{"name":"小豬",
"age":23,
"content":{"questionsTotal":2,
"questions": [ { "question": "what's your name?", "answer": "小豬"},{"question": "what's your age", "answer": "23"}]
}
}
* @param path 網(wǎng)頁(yè)路徑
* @return 返回List
* @throws Exception
*/
public static List<Map<String, String>> getJSON(String path) throws Exception {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
Map<String, String> map = null;
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 利用HttpURLConnection對(duì)象,我們可以從網(wǎng)絡(luò)中獲取網(wǎng)頁(yè)數(shù)據(jù).
conn.setConnectTimeout(5 * 1000); // 單位是毫秒,設(shè)置超時(shí)時(shí)間為5秒
conn.setRequestMethod("GET"); // HttpURLConnection是通過(guò)HTTP協(xié)議請(qǐng)求path路徑的,所以需要設(shè)置請(qǐng)求方式,可以不設(shè)置,因?yàn)槟J(rèn)為GET
if (conn.getResponseCode() == 200) {// 判斷請(qǐng)求碼是否是200碼,否則失敗
InputStream is = conn.getInputStream(); // 獲取輸入流
byte[] data = readStream(is); // 把輸入流轉(zhuǎn)換成字符數(shù)組
String json = new String(data); // 把字符數(shù)組轉(zhuǎn)換成字符串


/*數(shù)據(jù)形式:
{"name":"小豬",
"age":23,
"content":{"questionsTotal":2,
"questions": [ { "question": "what's your name?", "answer": "小豬"},{"question": "what's your age", "answer": "23"}]
}
}
*/
JSONObject jsonObject=new JSONObject(json); //返回的數(shù)據(jù)形式是一個(gè)Object類型,所以可以直接轉(zhuǎn)換成一個(gè)Object
String name=jsonObject.getString("name");
int age=jsonObject.getInt("age");
Log.i("abc", "name:" + name + " | age:" + age); //測(cè)試數(shù)據(jù)

JSONObject contentObject=jsonObject.getJSONObject("content"); //獲取對(duì)象中的對(duì)象
String questionsTotal=contentObject.getString("questionsTotal"); //獲取對(duì)象中的一個(gè)值
Log.i("abc", "questionsTotal:" + questionsTotal); //測(cè)試數(shù)據(jù)

JSONArray contentArray=contentObject.getJSONArray("questions"); //獲取對(duì)象中的數(shù)組
for (int i = 0; i < contentArray.length(); i++) {
JSONObject item = contentArray.getJSONObject(i); // 得到每個(gè)對(duì)象
String question = item.getString("question"); // 獲取對(duì)象對(duì)應(yīng)的值
String answer = item.getString("answer");

map = new HashMap<String, String>(); // 存放到MAP里面
map.put("question", question);
map.put("answer", answer);
list.add(map);
}
}

// ***********測(cè)試數(shù)據(jù)******************

for (Map<String, String> list2 : list) {
String question = list2.get("question");
String answer = list2.get("answer");
Log.i("abc", "question:" + question + " | answer:" + answer);
}
return list;
}




/**
* 把輸入流轉(zhuǎn)換成字符數(shù)組
* @param inputStream 輸入流
* @return 字符數(shù)組
* @throws Exception
*/
public static byte[] readStream(InputStream inputStream) throws Exception {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
bout.write(buffer, 0, len);
}
bout.close();
inputStream.close();

return bout.toByteArray();
}
}

相關(guān)文章

  • Android中Java和JavaScript交互實(shí)例

    Android中Java和JavaScript交互實(shí)例

    這篇文章主要介紹了Android中Java和JavaScript交互實(shí)例,本文給出了實(shí)現(xiàn)方法、實(shí)現(xiàn)代碼、js調(diào)用Java、java調(diào)用js等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • Android之Gallery使用例子

    Android之Gallery使用例子

    本篇文章主要介紹了Android之Gallery使用例子,Gallery用來(lái)顯示圖片列表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Android開發(fā)之Flutter與webview通信橋梁實(shí)現(xiàn)

    Android開發(fā)之Flutter與webview通信橋梁實(shí)現(xiàn)

    這篇文章主要為大家介紹了Android開發(fā)之Flutter與webview通信橋梁實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 深入學(xué)習(xí)Android?ANR?的原理分析及解決辦法

    深入學(xué)習(xí)Android?ANR?的原理分析及解決辦法

    Android系統(tǒng)中,AMS和WMS會(huì)檢測(cè)App的響應(yīng)時(shí)間,如果App在特定時(shí)間無(wú)法相應(yīng)屏幕觸摸或鍵盤輸入時(shí)間,或者特定事件沒有處理完畢,就會(huì)出現(xiàn)ANR。本文將帶領(lǐng)大學(xué)深入學(xué)習(xí)一下ANR的原理及解決辦法,感興趣的同學(xué)可以學(xué)習(xí)一下
    2021-11-11
  • Android APP集成新浪微博分享功能

    Android APP集成新浪微博分享功能

    這篇文章主要為大家詳細(xì)介紹了Android APP集成新浪微博分享功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Android TabLayout選項(xiàng)卡使用教程

    Android TabLayout選項(xiàng)卡使用教程

    這篇文章主要介紹了Android TabLayout選項(xiàng)卡使用,為什么會(huì)有這篇文章呢,是因?yàn)橹瓣P(guān)于TabLayout的使用陸陸續(xù)續(xù)也寫了好幾篇了,感覺比較分散,且不成體系,寫這篇文章的目的就是希望能把各種效果的實(shí)現(xiàn)一次性講齊
    2023-04-04
  • web app與原生app的區(qū)別

    web app與原生app的區(qū)別

    本文主要給大家分析介紹了web app與原生app的區(qū)別,以及各自的優(yōu)勢(shì)和劣勢(shì),推薦給大家,有需要的小伙伴來(lái)參考下吧
    2015-03-03
  • Android中的顏色表示的詳解

    Android中的顏色表示的詳解

    這篇文章主要介紹了Android中的顏色表示的詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • Android項(xiàng)目實(shí)戰(zhàn)手把手教你畫圓形水波紋loadingview

    Android項(xiàng)目實(shí)戰(zhàn)手把手教你畫圓形水波紋loadingview

    這篇文章主要為大家詳細(xì)介紹了Android項(xiàng)目實(shí)戰(zhàn)手把手教你畫圓形水波紋loadingview,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Android開發(fā)準(zhǔn)確獲取手機(jī)IP地址的兩種方式

    Android開發(fā)準(zhǔn)確獲取手機(jī)IP地址的兩種方式

    這篇文章主要介紹了Android開發(fā)準(zhǔn)確獲取手機(jī)IP地址的兩種方式,需要的朋友可以參考下
    2020-03-03

最新評(píng)論