JSON的定義:
一種輕量級的數據交換格式,具有良好的可讀和便於快速編寫的特性。業內主流技術爲其提供了完整的解決方案(有點類似於正則表達式 ,獲得了當今大部分語言的支持),從而可以在不同平臺間進行數據交換。JSON採用兼容性很高的文本格式,同時也具備類似於C語言體系的行爲。 – Json.org
JSON Vs XML
1.JSON和XML的數據可讀性基本相同
2.JSON和XML同樣擁有豐富的解析手段
3.JSON相對於XML來講,數據的體積小
4.JSON與JavaScript的交互更加方便
5.JSON對數據的描述性比XML較差
6.JSON的速度要遠遠快於XML
json解析類
android的json解析部分都在包org.json下,主要有以下幾個類:
- JSONObject:可以看作是一個json對象,這是系統中有關JSON定義的基本單元,其包含一對兒(Key/Value)數值。它對外部(External: 應用toString()方法輸出的數值)調用的響應體現爲一個標準的字符串(例如:{“JSON”: “Hello, World”},最外被大括號包裹,其中的Key和Value被冒號”:”分隔)。其對於內部(Internal)行爲的操作格式略微,例如:初始化一個JSONObject實例,引用內部的put()方法添加數值:new JSONObject().put(“JSON”, “Hello, World!”),在Key和Value之間是以逗號”,”分隔。Value的類型包括:Boolean、JSONArray、JSONObject、Number、String或者默認值JSONObject.NULL object 。
- JSONStringer:json文本構建類 ,根據官方的解釋,這個類可以幫助快速和便捷的創建JSON text。其最大的優點在於可以減少由於 格式的錯誤導致程序異常,引用這個類可以自動嚴格按照JSON語法規則(syntax rules)創建JSON text。每個JSONStringer實體只能對應創建一個JSON text。。其最大的優點在於可以減少由於格式的錯誤導致程序異常,引用這個類可以自動嚴格按照JSON語法規則(syntax rules)創建JSON text。每個JSONStringer實體只能對應創建一個JSON text。
JSONArray:它代表一組有序的數值。將其轉換爲String輸出(toString)所表現的形式是用方括號包裹,數值以逗號”,”分隔(例如: [value1,value2,value3],大家可以親自利用簡短的代碼更加直觀的瞭解其格式)。這個類的內部同樣具有查詢行爲, get()和opt()兩種方法都可以通過index索引返回指定的數值,put()方法用來添加或者替換數值。同樣這個類的value類型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默認值JSONObject.NULL object。
JSONTokener:json解析類
JSONException:json中用到的異常
那麼現在你是不是瞭解了一些關於Json的亂七八糟的東西呢,好的。現在開始我們的實例來進一步的學習一些Json的知識點。
首先在這裏的話先拿到一個Json的API接口,類型的API接口在網上也可以找到很多,自己可以去試試。
這裏的話說一下實例要實現的一個目的:將一個json的url地址解析成爲一個Android listview可以去加載的Bean 集合。
然後你可以用谷歌瀏覽器來打開它(先到Google的擴展插件中下載一個叫JSON-handle或者是JSONView的解析工具來解析你的json接口)。
解析效果圖
首先新建一個bean用來保存裏面的元素
package com.example.asynctask_test;
public class NewsBean {
public String NewsIcoUrl;
public String NewsContent;
public String NewsTitle;
}
然後將一個定義好的url地址交給下面的getJsonDate方法來解析json,
private static String URL = "http://www.imooc.com/api/teacher?type=4&num=30";
private List<NewsBean> getJsonDate(String url) {
// 聲明List<NewsBean>並初始化
List<NewsBean> newBeanList = new ArrayList<NewsBean>();
try {
String jsonString = readstream(new URL(url).openStream());
// URL(url).openStream() 和url.OpenConnection().getInputStream()相同,可根據URl直接獲取網絡資源數據,
// 返回類型爲InputStream類型
Log.d("xxxxxxxxx", jsonString);
return newBeanList;
}
private String readstream(InputStream is) {// 1、計算機可以識別的基本格式:字節
InputStreamReader isr;// 2、可見的字符流
BufferedReader bfr;// /3、可以高效讀取的字符串
String result = "";
try {
String line = "";//一行一行的讀出來
// 將InputStream類的字節流轉換成字符流
bfr = new BufferedReader(new InputStreamReader(is, "utf-8"));
while ((line = bfr.readLine()) != null) {
result += line;
}
} catch (UnsupportedEncodingException e) {
//
e.printStackTrace();
} catch (IOException e) {
//
e.printStackTrace();
}
return result;// 這裏的result是可以高效讀取的JSON格式的字符串
}
現在我們就得到了一個json格式字符串
{
"status": 1,
"data": [
{
"id": 1,
"name": "Tony老師聊shell——環境變量配置文件",
"picSmall": "http://img.mukewang.com/55237dcc0001128c06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/55237dcc0001128c06000338.jpg",
"description": "爲你帶來shell中的環境變量配置文件",
"learner": 12312
},
{
"id": 2,
"name": "數學知識在CSS動畫中的應用",
"picSmall": "http://img.mukewang.com/55249cf30001ae8a06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/55249cf30001ae8a06000338.jpg",
"description": "數學知識與CSS結合實現酷炫效果",
"learner": 45625
},
{
"id": 3,
"name": "Oracle數據庫開發必備利器之PL/SQL基礎",
"picSmall": "http://img.mukewang.com/5523711700016d1606000338-300-170.jpg",
"picBig": "http://img.mukewang.com/5523711700016d1606000338.jpg",
"description": "Oracle數據庫高級開發必備的基礎。",
"learner": 41236
},
{
"id": 4,
"name": "Android見證消息推送時刻進階篇",
"picSmall": "http://img.mukewang.com/551e470500018dd806000338-300-170.jpg",
"picBig": "http://img.mukewang.com/551e470500018dd806000338.jpg",
"description": "Android消息推送就在眼前,Come on",
"learner": 45456
},
{
"id": 5,
"name": "Avalon探索之旅基礎教程——複雜綁定",
"picSmall": "http://img.mukewang.com/551de0570001134f06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/551de0570001134f06000338.jpg",
"description": "前端迷您MVVM框架,Avalon複雜綁定屬性篇。",
"learner": 56556
},
{
"id": 6,
"name": "Android-Service系列之斷點續傳下載",
"picSmall": "http://img.mukewang.com/552640c300018a9606000338-300-170.jpg",
"picBig": "http://img.mukewang.com/552640c300018a9606000338.jpg",
"description": "想升職加薪麼?本章課程你值得擁有",
"learner": 48996
},
{
"id": 7,
"name": "JUnit—Java單元測試必備工具",
"picSmall": "http://img.mukewang.com/551b92340001c9f206000338-300-170.jpg",
"picBig": "http://img.mukewang.com/551b92340001c9f206000338.jpg",
"description": "Java單元測試利器!",
"learner": 13210
},
{
"id": 8,
"name": "細說Java多線程之內存可見性",
"picSmall": "http://img.mukewang.com/5518c3d7000175af06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/5518c3d7000175af06000338.jpg",
"description": "用兩種方式實現內存可見性",
"learner": 15051
},
{
"id": 9,
"name": "CSS動畫實用技巧",
"picSmall": "http://img.mukewang.com/551b98ae0001e57906000338-300-170.jpg",
"picBig": "http://img.mukewang.com/551b98ae0001e57906000338.jpg",
"description": "教你使用CSS實現驚豔的動畫效果!",
"learner": 15210
},
{
"id": 10,
"name": "C++遠征之起航篇",
"picSmall": "http://img.mukewang.com/550b86560001009406000338-300-170.jpg",
"picBig": "http://img.mukewang.com/550b86560001009406000338.jpg",
"description": "C++亮點盡在其中",
"learner": 84545
},
{
"id": 11,
"name": "Tony老師聊shell——運算符",
"picSmall": "http://img.mukewang.com/551916790001125706000338-300-170.jpg",
"picBig": "http://img.mukewang.com/551916790001125706000338.jpg",
"description": "Tony爲你帶來shell編程中的運算符!",
"learner": 18411
},
{
"id": 12,
"name": "如何使用高德雲圖在線製作屬於你的地圖",
"picSmall": "http://img.mukewang.com/5518ecf20001cb4e06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/5518ecf20001cb4e06000338.jpg",
"description": "教你迅速使用雲圖進行基於LBS的開發。",
"learner": 56432
},
{
"id": 13,
"name": "鬼斧神工之正則表達式",
"picSmall": "http://img.mukewang.com/5518bbe30001c32006000338-300-170.jpg",
"picBig": "http://img.mukewang.com/5518bbe30001c32006000338.jpg",
"description": "正則表達式是計算機編程語言界的鬼斧神工。",
"learner": 25210
},
{
"id": 14,
"name": "如何使用高德Windows Phone SDK進行基於LBS的開發",
"picSmall": "http://img.mukewang.com/551380400001da9b06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/551380400001da9b06000338.jpg",
"description": "教你迅速使用WP SDK進行基於LBS的開發",
"learner": 56445
},
{
"id": 15,
"name": "canvas實現星星閃爍特效",
"picSmall": "http://img.mukewang.com/550a33b00001738a06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/550a33b00001738a06000338.jpg",
"description": "使用HTML5實現輪播圖片上的序列幀。",
"learner": 45658
},
{
"id": 16,
"name": "如何使用高德JS-API進行基於LBS的開發",
"picSmall": "http://img.mukewang.com/5513a1b50001752806000338-300-170.jpg",
"picBig": "http://img.mukewang.com/5513a1b50001752806000338.jpg",
"description": "教你迅速用高德JS-API進行基於LBS的開發",
"learner": 15222
},
{
"id": 17,
"name": "Duang~MySQLi擴展庫來襲",
"picSmall": "http://img.mukewang.com/5513e20600017c1806000338-300-170.jpg",
"picBig": "http://img.mukewang.com/5513e20600017c1806000338.jpg",
"description": "Duang~一起開啓MySQLi的學習之旅吧!",
"learner": 46321
},
{
"id": 18,
"name": "如何使用高德Android SDK進行基於LBS的開發",
"picSmall": "http://img.mukewang.com/550a78720001f37a06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/550a78720001f37a06000338.jpg",
"description": "教你迅速使用Android SDK進行基於LBS的開發",
"learner": 12130
},
{
"id": 19,
"name": "高德地圖組件快速入門",
"picSmall": "http://img.mukewang.com/550a836c0001236606000338-300-170.jpg",
"picBig": "http://img.mukewang.com/550a836c0001236606000338.jpg",
"description": "教你迅速使用地圖組件進行基於LBS的開發",
"learner": 54540
},
{
"id": 20,
"name": "如何使用高德定位進行開發",
"picSmall": "http://img.mukewang.com/550a87da000168db06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/550a87da000168db06000338.jpg",
"description": "教你迅速使用定位進行基於LBS的開發",
"learner": 45665
},
{
"id": 21,
"name": "Yahoo軍規",
"picSmall": "http://img.mukewang.com/530f0ef700019b5906000338-300-170.jpg",
"picBig": "http://img.mukewang.com/530f0ef700019b5906000338.jpg",
"description": "做爲WEB前端攻城師,您必須知道的網站性能優化規則。",
"learner": 12123
},
{
"id": 22,
"name": "Ajax全接觸",
"picSmall": "http://img.mukewang.com/549bda090001c53e06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/549bda090001c53e06000338.jpg",
"description": "由淺入深,循序漸進學習Ajax的相關概念、原理、實現方式和應用方法。",
"learner": 46456
},
{
"id": 23,
"name": "jQuery源碼解析(DOM與核心模塊)",
"picSmall": "http://img.mukewang.com/547d5a45000156f406000338-300-170.jpg",
"picBig": "http://img.mukewang.com/547d5a45000156f406000338.jpg",
"description": "前端架構師的必經之路,揭開框架背後的祕密。",
"learner": 51456
},
{
"id": 24,
"name": "用字體在網頁中畫ICON圖標",
"picSmall": "http://img.mukewang.com/54780ea90001f3b406000338-300-170.jpg",
"picBig": "http://img.mukewang.com/54780ea90001f3b406000338.jpg",
"description": "圖標戀上字體,就像老鼠愛上大米!",
"learner": 16456
},
{
"id": 25,
"name": "CSS3絢麗照片牆",
"picSmall": "http://img.mukewang.com/547ed1c9000150cc06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/547ed1c9000150cc06000338.jpg",
"description": "簡單CSS3屬性輕鬆實現絢麗照片牆效果。",
"learner": 26456
},
{
"id": 26,
"name": "SEO在網頁製作中的應用",
"picSmall": "http://img.mukewang.com/54214727000160e306000338-300-170.jpg",
"picBig": "http://img.mukewang.com/54214727000160e306000338.jpg",
"description": "讓您快速邁進SEO的門,不容錯過!",
"learner": 12436
},
{
"id": 27,
"name": "CSS深入理解之absolute",
"picSmall": "http://img.mukewang.com/54125edc0001ce6306000338-300-170.jpg",
"picBig": "http://img.mukewang.com/54125edc0001ce6306000338.jpg",
"description": "全面深入理解CSS的position:absolute聲明。",
"learner": 45345
},
{
"id": 28,
"name": "玩轉KISSY框架",
"picSmall": "http://img.mukewang.com/548165820001b4b006000338-300-170.jpg",
"picBig": "http://img.mukewang.com/548165820001b4b006000338.jpg",
"description": "全網唯一系統講解KISSY框架從入門到精通的教程。",
"learner": 11456
},
{
"id": 29,
"name": "CSS深入理解之float浮動",
"picSmall": "http://img.mukewang.com/53d74f960001ae9d06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/53d74f960001ae9d06000338.jpg",
"description": "主要介紹了浮動屬性的前世與今生,糟粕與精華,誤解與濫用等。",
"learner": 45656
},
{
"id": 30,
"name": "CSS未來",
"picSmall": "http://img.mukewang.com/54c87c73000150cf06000338-300-170.jpg",
"picBig": "http://img.mukewang.com/54c87c73000150cf06000338.jpg",
"description": "CSS之父Bert Bos帶來的分享。",
"learner": 13436
}
],
"msg": "成功"
}
下面就講得到的json格式的字符串存入封裝好的bean中。
private List<NewsBean> getJsonDate(String url) {
// 聲明List<NewsBean>並初始化
List<NewsBean> newBeanList = new ArrayList<NewsBean>();
try {
String jsonString = readstream(new URL(url).openStream());
Log.d("jair", jsonString);
JSONObject jsonObject;
NewsBean newsBean;
try {
jsonObject = new JSONObject(jsonString);
JSONArray jsonArray = jsonObject.getJSONArray("data");
// 通過如下for循環就可以將jsonString原始字符數據導入到每個NewsBean對象中。
for (int i = 0; i < jsonArray.length(); i++) {
jsonObject = jsonArray.getJSONObject(i);
newsBean = new NewsBean();
// 從jsonObject中得到每個元素放入到我們封裝好的newsBean中
newsBean.NewsIcoUrl = jsonObject.getString("picSmall");
newsBean.NewsTitle = jsonObject.getString("name");
newsBean.NewsContent = jsonObject.getString("description");
newBeanList.add(newsBean);
// 最後通過newsBeanList.add(newsBean)組成一個List<NewsBean>對象,這是構成Adapter適配器的原始數據。
}
} catch (JSONException e) {
//
e.printStackTrace();
}
} catch (MalformedURLException e) {
//
e.printStackTrace();
} catch (IOException e) {
//
e.printStackTrace();
}
return newBeanList;
}
現在我們就得到了一個可以在適配器中使用的List集合。
這裏附上實例的源碼
下載地址
實現效果圖
“`