Android json的一些學習

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 集合。

JSON API接口

然後你可以用谷歌瀏覽器來打開它(先到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集合。

這裏附上實例的源碼
下載地址

實現效果圖

這裏寫圖片描述“`

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