轉,JSON解析2

?JSON 使用講解?這篇文章講解了,JSON的介紹以及使用GSON解析。今天,我們就在Android項目中使用兩種方式解析JSON數據。如果你對JSON,還不熟悉,那么請看JSON 使用講解。

一.搭建服務以及制造JSON數據。

1.服務器選擇的Tomcat,下載鏈接。下載安裝成功后,服務啟動后,在瀏覽器中輸入'http://localhost:8080/',看到如下截圖,那就說明啟動成功了。

2.Tomcat服務器啟動好后,找到它的安裝目錄‘D:\Apache Software Foundation\Tomcat 6.0\webapps’(我的安裝目錄是 ‘D:\Apache Software Foundation\Tomcat 6.0\webapps’),然后在該目錄下,新建文件夾‘json’,在該文件夾中,創建文件‘get_data.json’,在該文件中輸入JSON字符串,格式如下‘[{"id":1,"name":"zhangsan","age":30},{"id":2,"name":"lisi","age":20}]’。

3.此時在瀏覽器中輸入‘http://localhost:8080/json/get_data.json’,如果出現如下截圖,說明上面的操作是成功的。

??? 經過上面3步,我們就把JSON數據創建好了,接下來就是Android客戶端的實現了。

二.Android客戶端的實現。

1.創建Android項目。這個不用詳細描述了。

2.首先記得在AndroidManifest.xml中加入網絡權限。

?

[java]?view plaincopy
  1. <uses-permission?android:name="android.permission.INTERNET"/>??

3.網絡請求實現。使用URLConnection實現的。

?

?

[java]?view plaincopy
  1. public?static?String?getData1(String?urlStr)?{??
  2. ????????String?resultData?=?"";??
  3. ????????//?構造URL??
  4. ????????try?{??
  5. ????????????URL?url?=?new?URL(urlStr);??
  6. ????????????//?打開連接??
  7. ????????????URLConnection?con?=?url.openConnection();??
  8. ????????????con.setConnectTimeout(10?*?1000);??
  9. ????????????con.setReadTimeout(10?*?1000);??
  10. ????????????InputStream?is?=?con.getInputStream();??
  11. ????????????BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(is));??
  12. ????????????String?line?=?null;??
  13. ????????????StringBuffer?sb?=?new?StringBuffer();??
  14. ????????????while?((line?=?br.readLine())?!=?null)?{??
  15. ????????????????sb.append(line);??
  16. ????????????}??
  17. ????????????resultData=sb.toString();??
  18. ????????????return?resultData;??
  19. ????????}?catch?(MalformedURLException?e)?{??
  20. ????????????//?TODO?Auto-generated?catch?block??
  21. ????????????e.printStackTrace();??
  22. ????????}?catch?(IOException?e)?{??
  23. ????????????//?TODO?Auto-generated?catch?block??
  24. ????????????e.printStackTrace();??
  25. ????????}??
  26. ????????return?null;??
  27. ????}??

4.功能實現。

?

??? 在MainActivity中加入一個按鈕,點擊的時候獲取網絡數據,并且請求網絡要在子線程中進行。有一點需要補充就是手機訪問電腦時的IP地址,如果你使用手機訪問電腦,IP地址還是‘localhost’,肯定是訪問不了的,因為‘localhost’指的是本機,如果使用手機訪問‘localhost’,那肯定是訪問不到電腦的。這個IP可以有兩種寫法,一種是,當你使用模擬器訪問的話,IP可以寫成‘10.0.2.2’;另一種是,直接寫為電腦在局域網內的IP地址,例如‘192.168.1.114’(我電腦的IP地址);建議直接寫成電腦在局域網內的IP地址。詳細實現如下代碼所示,

?

[java]?view plaincopy
  1. public?class?MainActivity?extends?Activity?{??
  2. ??
  3. ????String?url?=?"http://192.168.1.114:8080/json/get_data.json";??
  4. ??
  5. ????@Override??
  6. ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  7. ????????super.onCreate(savedInstanceState);??
  8. ????????setContentView(R.layout.activity_main);??
  9. ??
  10. ????????findViewById(R.id.btn_getdata).setOnClickListener(??
  11. ????????????????new?OnClickListener()?{??
  12. ??
  13. ????????????????????@Override??
  14. ????????????????????public?void?onClick(View?v)?{??
  15. ????????????????????????//?TODO?Auto-generated?method?stub??
  16. ????????????????????????new?MyThread().start();??
  17. ????????????????????}??
  18. ????????????????});??
  19. ????}??
  20. ??
  21. ????class?MyThread?extends?Thread?{??
  22. ????????@Override??
  23. ????????public?void?run()?{??
  24. ????????????String?jsonStr?=?NetWorkUtils.getData1(url);??
  25. ????????????if?(!TextUtils.isEmpty(jsonStr))?{??
  26. ????????????????Log.e("jsonStr",?jsonStr);??
  27. ?????????????????parseJsonData(jsonStr);??
  28. //??????????????parseJsonData1(jsonStr);??
  29. ????????????}??
  30. ????????}??
  31. ????}??
  32. }??

解析JSON采用三種方式。

?

5.使用JSONObject解析。代碼很簡單,就不多說了,示例如下,

?

[java]?view plaincopy
  1. /**?
  2. ?????*?使用JSONArray和JSONObject解析?
  3. ?????*??
  4. ?????*?@param?jsonStr?
  5. ?????*/??
  6. ????private?void?parseJsonData(String?jsonStr)?{??
  7. ????????try?{??
  8. ????????????JSONArray?array?=?new?JSONArray(jsonStr);??
  9. ????????????for?(int?i?=?0;?i?<?array.length();?i++)?{??
  10. ????????????????JSONObject?jsonObject?=?array.getJSONObject(i);??
  11. ????????????????int?id?=?jsonObject.getInt("id");??
  12. ????????????????String?name?=?jsonObject.getString("name");??
  13. ????????????????int?age?=?jsonObject.getInt("age");??
  14. ????????????????Person?person?=?new?Person(id,?name,?age);??
  15. ????????????????Log.e("person",?person.toString());??
  16. ????????????}??
  17. ????????}?catch?(JSONException?e)?{??
  18. ????????????//?TODO?Auto-generated?catch?block??
  19. ????????????e.printStackTrace();??
  20. ????????}??
  21. ????}??

6.使用GSON解析。代碼就更簡單,示例如下,

[java]?view plaincopy
  1. /**?
  2. ?????*?使用GSON解析?
  3. ?????*??
  4. ?????*?@param?jsonStr?
  5. ?????*/??
  6. ????private?void?parseJsonData1(String?jsonStr)?{??
  7. ????????Gson?gson?=?new?Gson();??
  8. ????????List<Person>?list?=?gson.fromJson(jsonStr,??
  9. ????????????????new?TypeToken<List<Person>>()?{??
  10. ????????????????}.getType());??
  11. ????????for?(Person?person?:?list)?{??
  12. ????????????Log.e("person",?person.toString());??
  13. ????????}??
  14. ????}??

?

7.使用JackJson解析,做了一個JackJson工具類,代碼如下:

?

[java]?view plaincopy
  1. /**?
  2. ?*?jackjson??
  3. ?*/??
  4. public?class?JackJsonUtils?{??
  5. ??
  6. ??????
  7. ????/**?
  8. ?????*?解析?
  9. ?????*??
  10. ?????*?@param?content?
  11. ?????*?@param?valueType?
  12. ?????*?@return?
  13. ?????*/??
  14. ????public?static?<T>?T?fromJson(String?content,?Class<T>?valueType)?{??
  15. ????????????ObjectMapper?objectMapper?=?new?ObjectMapper();??
  16. ????????try?{??
  17. ????????????return?objectMapper.readValue(content,?valueType);??
  18. ????????}?catch?(Exception?e)?{??
  19. ????????????e.printStackTrace();??
  20. ????????}??
  21. ????????return?null;??
  22. ????}??
  23. ??
  24. ????/**?
  25. ?????*?生成json?
  26. ?????*??
  27. ?????*?@param?object?
  28. ?????*?@return?
  29. ?????*/??
  30. ????public?static?String?toJSon(Object?object)?{??
  31. ????????ObjectMapper?objectMapper?=?new?ObjectMapper();??
  32. ????????try?{??
  33. ????????????return?objectMapper.writeValueAsString(object);??
  34. ????????}?catch?(Exception?e)?{??
  35. ????????????e.printStackTrace();??
  36. ????????}??
  37. ????????return?null;??
  38. ????}??
  39. }??

調用代碼,

?

?

[java]?view plaincopy
  1. /**?
  2. ?*?jackjson解析?
  3. ?*??
  4. ?*?@param?jsonStr?
  5. ?*/??
  6. public?void?parserByJackJson(String?jsonStr)?{??
  7. ????Person[]?persons?=?JackJsonUtils.fromJson(jsonStr,?Person[].class);??
  8. ????for?(Person?person?:?persons)?{??
  9. ????????Log.e("person",?person.toString());??
  10. ????}??
  11. }??

?

運行后的截圖如下,

PS:也許你使用JackJson解析可能會報錯,日志截圖如下:

解決方法是,在你的實體類中加入無參的構造函數就完美解決了!希望能幫到你!實體類的代碼如下:

?

[java]?view plaincopy
  1. public?class?Person?implements?Serializable?{??
  2. ????/**?
  3. ?????*??
  4. ?????*/??
  5. ????private?static?final?long?serialVersionUID?=?1L;??
  6. ????private?int?id;??
  7. ????private?String?name;??
  8. ????private?int?age;??
  9. ??
  10. ????public?Person()?{??
  11. ????????super();??
  12. ????????//?TODO?Auto-generated?constructor?stub??
  13. ????}??
  14. ??
  15. ????public?Person(int?id,?String?name,?int?age)?{??
  16. ????????super();??
  17. ????????this.id?=?id;??
  18. ????????this.name?=?name;??
  19. ????????this.age?=?age;??
  20. ????}??
  21. ??
  22. ????public?int?getId()?{??
  23. ????????return?id;??
  24. ????}??
  25. ??
  26. ????public?void?setId(int?id)?{??
  27. ????????this.id?=?id;??
  28. ????}??
  29. ??
  30. ????public?String?getName()?{??
  31. ????????return?name;??
  32. ????}??
  33. ??
  34. ????public?void?setName(String?name)?{??
  35. ????????this.name?=?name;??
  36. ????}??
  37. ??
  38. ????public?int?getAge()?{??
  39. ????????return?age;??
  40. ????}??
  41. ??
  42. ????public?void?setAge(int?age)?{??
  43. ????????this.age?=?age;??
  44. ????}??
  45. ??
  46. ????@Override??
  47. ????public?String?toString()?{??
  48. ????????return?"Person?[id="?+?id?+?",?name="?+?name?+?",?age="?+?age?+?"]";??
  49. ????}??
  50. ??
  51. }??

?

三.總結。

??? 使用了三種方式去解析JSON數據。個人建議,如果你是在Android開發,建議使用GSON,畢竟是谷歌自己的東西,使用放心,可靠!如果你是做后臺服務或者接口開發,建議使用JackJson,強大、快速!相信你現在已經對JSON解析有更深入的了解了

轉載于:https://www.cnblogs.com/zhanglijun/articles/8337567.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453603.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453603.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453603.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試問題匯總 精選 分析 解答 職業規劃 part 2

面試困惑問與答&#xff08;2&#xff09;——感覺挺好&#xff0c;為啥被拒了&#xff1f; 問&#xff1a;技術面試的時候&#xff0c;題目挺簡單的&#xff0c;我覺得自己都做出來了。可最后怎么還是被拒了啊&#xff1f; 答&#xff1a;面試被拒有很多種可能&#xff0c;比…

js順序加載

2019獨角獸企業重金招聘Python工程師標準>>> js想要順序加載&#xff0c;分開js代碼塊&#xff0c;jsp頁面在加載的時候&#xff0c;是順序加載&#xff0c;遇到<script></script>代碼塊&#xff0c;先加載完成&#xff0c;然后繼續往下&#xff0c;遇到…

java swingworker_Java中的SwingWorker

L&#xff06;F物質的輸出(因為您對EDT的不確定性有待測試)run:JButton openDialog >>> Is there EDT ??? trueWorker started >>> Is there EDT ??? falsewaiting 30secondsWorker endeded >>> Is there EDT ??? falsebefore JOptionP…

持續交付與滾動升級

介紹 持續交付是頻繁對軟件應用程序持續更新的概念. 這個想法使在大量頻繁的更新面前, 你不必等待在一個指定的特殊時間點, 并且使你的組織在響應過程中變得更好. 一些 Ansible 用戶每小時都在部署更新給他們的最終用戶甚至更加頻繁 – 每時每刻都有代碼修改的批準. 要實現這一…

2-05 使用固態存儲SSD或PCIe卡

在大量并發的情況下&#xff0c;才能體現固態磁盤的吞吐量&#xff0c;在大并發下提供良好隨機io的性能&#xff0c;這正是關系型數據庫所需要的&#xff0c;相對應機械磁盤&#xff0c;固態磁盤更容易損壞&#xff08;第三點是固態磁盤的缺點&#xff09;&#xff0c;由于固態…

面試問題匯總 精選 分析 解答 職業規劃 part 3

《劍指Offer——名企面試官精講典型編程題》已經出版 非常感謝博客上的讀者&#xff0c;是大家的關心、支持和鼓勵讓我有信心寫完這本書并最終出版發行&#xff08; china-pub互動網、 亞馬遜卓越網、 淘寶網、 京東網、 當當網上有售&#xff09;。網友們的鼓勵讓我在 博客上的…

java 分布式rpc框架_分布式RPC框架Apache Dubbo(一)

4 Dubbo快速入門Dubbo作為一個RPC框架&#xff0c;其最核心的功能就是要實現跨網絡的遠程調用。本小節就是要創建兩個應用&#xff0c;一個作為服務的提供方&#xff0c;一個作為服務的消費方。通過Dubbo來實現服務消費方遠程調用服務提供方的方法。4.1 服務提供方開發開發步驟…

輕松獲知數據庫事務

標題索引事務作用事務流程隔離級別實例驗證事務作用事務是確保數據庫系統數據的完整性的功能&#xff0c;如現在互聯網行業支付業務&#xff0c;不管服務器出于什么原因異常中斷&#xff0c;客戶要么支付成功要么支付不成功&#xff0c;支付成功數據庫金額即會發生變化&#xf…

Python冒泡排序(4)

Python代碼&#xff1a; """ 冒泡排序&#xff08;4&#xff09;在未排序的數中&#xff0c;通過兩兩比較[換位]的方式&#xff0c;將最小的數移至首位 N個數排序&#xff0c;則需要執行N-1輪&#xff0c;第1輪比較N-1次&#xff0c;后續每輪比上一輪少比較1次本…

打印hello world java_java – 如何打印“hello world”?

數字4946144450195624適合64位&#xff0c;其二進制表示為&#xff1a;10001100100100111110111111110111101100011000010101000該程序對每5位組的字符進行解碼&#xff0c;從右到左00100|01100|10010|01111|10111|11111|01111|01100|01100|00101|01000d | l | r | o | w | | o…

研發人員為什么留不住

研發人員為什么留不住&#xff1f;(1)——問題與現象 研發團隊做為公司的核心&#xff0c;承擔了完成項目為公司賺錢的目的。研發人員在公司倍受重視的同時&#xff0c;并沒有降低流失率。 問題與現象 以下問題相信您會在朋友口中&#xff0c;甚至自己的公司聽到。 老板說&a…

算法與編程--1

1、編寫一個程序&#xff0c;將a.txt文件中的單詞與b.txt文件中的單詞交替合并到c.txt文件中&#xff0c;a.txt文件中的單詞用回車符分隔&#xff0c;b.txt文件中用回車或空格進行分隔。 package com.test;import java.io.File; import java.io.FileNotFoundException; import …

Safari支不支持HTML5錄音? 現在瀏覽器中最好的解決方案是WebRTC下的 navigator.getUserMedia API。...

先放結論&#xff1a;Safari支不支持HTML5錄音&#xff1f; ——據我調查&#xff0c;不支持。 現在瀏覽器中最好的解決方案是WebRTC下的 navigator.getUserMedia API。 可是當使用Can I use查看兼容性的時候&#xff0c;我發現 不過這個是有歷史原因的&#xff0c;我記得RTC是…

python lambda map reduce_簡單了解python filter、map、reduce的區別

這篇文章主要介紹了簡單了解python filter、map、reduce的區別,文中通過示例代碼介紹的非常詳細&#xff0c;對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下python中有一些非常有趣的函數&#xff0c;面試的時候可能會遇到。今天也來總結一下&#xff0c;不…

面試問題匯總 精選 分析 解答 職業規劃 part 4

程序員做業余項目、記筆記和寫博客的重要性【經典】 編程是一種創造過程&#xff0c;業余項目允許程序員在沒有截止日期或各種限制的條件下&#xff0c;以探索形式編程。業余項目之所以重要&#xff0c;有以下幾個原因。 探索新技術 每天都會不斷有新技術出現&#xff0c;而…

NB-IOT連接移動onenet平臺流程

1. 先創建賬號&#xff0c;然后創建產品 2. 創建設備&#xff0c;用ATCGSN和ATCIMI查詢NB-IOT的IMEI和IMSI填寫上去。 3. 創建好的設備。 轉載于:https://www.cnblogs.com/429512065qhq/p/8359247.html

sort,uniq,wc指令簡單用法

sort用于排序&#xff0c;可以根據不同的數據類型來進行排序&#xff0c;例如想要查看最后一個登陸的用戶信息&#xff0c;可以把last和sort結合起來使用&#xff0c;按照登陸時間排序。 使用sort排序&#xff1a; sort常用參數&#xff1a; -f &#xff1a;忽略大小寫的差異 -…

java ejb jsp 架構_JavaEE架構

B/S 體系結構image.pngJava EE 經典架構image.pngJava EE 13規范JDBCimage.pngJDBC 對象與接口java.sql.DriverManager&#xff1a;用于管理JDBC驅動的服務類&#xff0c;當JDBC驅動加載至內存后&#xff0c;DriverManager會自動注冊JDBC驅動&#xff0c;然后通過getConnection…

音視頻中的CBR,VBR,ABR

視頻碼率CBR和VBR 固定碼率&#xff08;CBR&#xff09;與可變碼率&#xff08;VBR&#xff09; 一般在我們輸出視頻文件的時候都會碰到一個選擇即CBR與VBR&#xff0c;CBR的英文全稱是Constant Bit Rate翻譯過來是固定碼率&#xff0c;就是說每一秒種的畫面如果看做是一個…

fifo java_java – 如何保證ThreadPoolExecutor中的FIFO執行順序

我用這行代碼創建一個ThreadPoolExecutor&#xff1a;private ExecutorService executor new ThreadPoolExecutor(5, 10, 120, TimeUnit.SECONDS, new ArrayBlockingQueue(20, true));然后,我運行25個任務(T01到T25),所以情況是&#xff1a;>目前正在運行的5個任務(T01到T0…