Java JSONObject與JSONArray對(duì)象案例詳解
JSONObject與JSONArray
最近在學(xué)習(xí)過(guò)程中用到了稍微復(fù)雜點(diǎn)的json數(shù)據(jù)需要將json數(shù)據(jù)解析出來(lái),這里就截取一部分作為例子
1.JSONObject介紹
JSONObject-lib包是一個(gè)beans,collections,maps,java arrays和xml和JSON互相轉(zhuǎn)換的包。
2.下載jar包
xiazai.jb51.net/202109/yuanma/json-object-lib_jb51.rar
*或者在Maven的pom.xml文件中直接配置如下:
<dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency>
json數(shù)據(jù):
{ "cartypes":[ {"id":1,"imgUrl":"img/l.jpg","bigimg": "img/d.jpg","title":"別克威朗","marketprice":"15.29","periods":"12", "endrepayone":"96800","endrepaytwo":"96800","endrepaythree":"93000", "endmonthone":"3408","endmonthtwo":"3408","endmonththree":"3278", "repayfirst":"15290","repaytwo":"22935", "repaythree":"30580", "monthrepayone":"3578","monthrepaytwo":"2878","monthrepaythree":"2478", "cardetails": [{ "imageId00": "img/first-bkwl.jpg", "imageId01": "img/bkwl01.jpg", "imageId02": "img/bkwl02.jpg", "imageId03": "img/bkwl03.jpg", "imageId04": "img/bkwl04.jpg", "carname": "別克", "carmatter": "威朗", "carvolume":"1.5L", "sitnum":"5", "cargearbox":"6擋手自一體", "caremission":"國(guó)V", "carldone":"一體式座艙", "carldtwo":"絨面內(nèi)飾", "carldthree":"全景天窗", "carldfour":"展翼型HID大燈" }] }, {"id":2,"imgUrl":"img/l.jpg","bigimg": "img/d.jpg","title":"英菲尼迪","marketprice":"18.98","periods":"12", "endrepayone":"126800","endrepaytwo":"126800","endrepaythree":"126800", "endmonthone":"4458","endmonthtwo":"4458","endmonththree":"4458", "repayfirst":"18980","repaytwo":"28470", "repaythree":"37960", "monthrepayone":"2738","monthrepaytwo":"1878","monthrepaythree":"998", "cardetails": [{ "imageId00": "img/first.jpg", "imageId01": "img/yfnd01.jpg", "imageId02": "img/yfnd02.jpg", "imageId03": "img/yfnd03.jpg", "imageId04": "img/yfnd04.jpg", "carname": "英菲尼迪", "carmatter": "ESQ", "carvolume":"1.6L", "sitnum":"5", "cargearbox":"CVT無(wú)級(jí)變速", "caremission":"國(guó)V", "carldone":"定制輪轂", "carldtwo":"多功能方向盤(pán)", "carldthree":"LED尾燈", "carldfour":"真皮座椅" }] } ] }
面對(duì)這樣數(shù)組與對(duì)象相互嵌套的情況需要一步步將數(shù)據(jù)拆分,主要思想還是根據(jù)鍵取值,對(duì)于數(shù)組類型還是需要先根據(jù)”下標(biāo)”取出元素。這里還需要用到JSONObject與JSONArray。
將上面的json數(shù)據(jù)簡(jiǎn)化就是:(這里保留個(gè)id便于識(shí)別)
{ "cartypes":[ { "id":1,"bigimg": "img/dt-bkwl.jpg", "cardetails": [{ "imageId02": "img/bkwl02.jpg}] } { "id":2,"bigimg": "img/xxx.jpg", "cardetails":[{"imageId002":"img/xx.jpg"}] } ] }
這就是簡(jiǎn)化了的json數(shù)據(jù),可以看出這個(gè)串最外層是一個(gè)大的鍵為cartypes的對(duì)象,而它的值是json數(shù)組形式的比較復(fù)雜的json數(shù)據(jù)。繼續(xù)分析 [ ]的部分,可以看到,里面有兩個(gè)數(shù)組元素,每個(gè)元素分別是被{ }包起來(lái)的json對(duì)象,他們的元素組成相同,再看每個(gè)元素里面包含幾個(gè)鍵值對(duì)的數(shù)據(jù),其中鍵cardetails的值又是一個(gè)嵌套的json數(shù)組,里面包含一個(gè)json對(duì)象。分析完畢。那該怎樣才能(拿到數(shù)據(jù))解析呢?
使用JSONObject與JSONArray
一般取數(shù)據(jù)有兩種方式,看需要選擇。
方式①:
通過(guò) JSONObject.getString("鍵")直接獲取,這種方式只能每次獲取一個(gè)。
方式②
通過(guò)構(gòu)建與json對(duì)象相應(yīng)的bean來(lái)獲取。
我在寫(xiě)上面的例子時(shí)用到了兩種方式,由于需要使用到 id,bigimg以及cardetails中的大部分?jǐn)?shù)據(jù),因此我在使用時(shí)將cardetails封裝成一個(gè)bean,方便使用,而其他用到的比較少,因此就直接根據(jù)鍵獲取值。
另外需要注意的是,JSONObject,JSONArray分別對(duì)應(yīng)的是json數(shù)據(jù)的兩種格式。即{"張三" : "男"} , [{ 張三" : " 男" }] ,使用時(shí)需要將其轉(zhuǎn)換成對(duì)應(yīng)的對(duì)象。
如(示例):
JSONObject jsonObject = JSONObject.fromObject(json); //將json字符串轉(zhuǎn)換為JSONObject JSONArray jsonArray = JSONArray.fromObject(json); //將json字符串轉(zhuǎn)換為JSONArray
還有一點(diǎn)需要指出:在取鍵值是始終需要根據(jù)鍵取值,從外到內(nèi),取內(nèi)層的鍵的值需要先獲取外層鍵的值,如果跨越取值會(huì)報(bào)錯(cuò)。
下面演示取值:
JSONObject jsonObject = JSONObject.fromObject(json); //將json字符串轉(zhuǎn)化為JSONObject String cartypes=jsonObject.getString("cartypes"); //通過(guò)getString("cartypes")取出里面的信息 JSONArray jsonArray = JSONArray.fromObject(cartypes); //將取到的cartypes對(duì)應(yīng)的(一組)值字符串轉(zhuǎn)換為JSONArray String id= job.getString("id"); //取id String bigImg = job.getString("bigimg"); //大圖 System.out.println("bigImg:"+bigImg); //可以顯示已經(jīng)拿到bigimg的值
由于cardetails下的基本都是需要的值,一個(gè)一個(gè)取值比較麻煩,因此將cardetails封裝成一個(gè)bean 如下:
Cardetails.java
public class Cardetails { private String imageId00; private String imageId01; private String imageId02; private String imageId03; private String imageId04; private String carname; private String carmatter; private String carvolume; private int sitnum; private String cargearbox; private String caremission; private String carldone; private String carldtwo; private String carldthree; private String carldfour; //get set 方法以及toString方法略 }
到這里,需要將cardetails中的鍵全轉(zhuǎn)成Cardetails中的屬性,方法如下:
//將cardetail封裝成bean JSONArray carDetailArr=job.getJSONArray("cardetails");//將json字符串轉(zhuǎn)化為JSONArray JSONObject carDetailObj = carDetailArr.getJSONObject(0);//獲取數(shù)組第一個(gè)元素 Cardetails cardetails = (Cardetails) JSONObject.toBean(carDetailObj, Cardetails.class);//封裝成bean System.out.println("cardetails:"+cardetails); //能獲取到數(shù)據(jù)
最后附上部分代碼:
public void getICarDetail(int id){ String json=null; try { json=iCarDetail.getICarDetail(id);//這里既是獲取上面json數(shù)據(jù) } catch (Exception e) { e.printStackTrace(); } int jsonId=0;//json數(shù)組里的id值 JSONObject jsonObject = JSONObject.fromObject(json); //將json字符串轉(zhuǎn)化為JSONObject String cartypes=jsonObject.getString("cartypes");//通過(guò)getString("cartypes")取出里面的信息 JSONArray jsonArray = JSONArray.fromObject(cartypes); //將取到的cartypes對(duì)應(yīng)的(一組)值字符串轉(zhuǎn)換為JSONArray //遍歷jsonarray 數(shù)組 if(jsonArray.size()>0){ for(int i=0;i<jsonArray.size();i++){ JSONObject job = jsonArray.getJSONObject(i);//把每一個(gè)對(duì)象轉(zhuǎn)成json對(duì)象 jsonId=(int)job.get("id"); //得到每個(gè)對(duì)象中的id值 if(jsonId==id){ //獲取相關(guān)值 String title = job.getString("title"); String bigImg = job.getString("bigimg"); String repayFirst = job.getString("repayfirst"); String endrepayone = job.getString("endrepayone"); String endmonthone = job.getString("endmonthone"); String marketprice = job.getString("marketprice"); //將cardetail封裝成bean JSONArray carDetailArr=job.getJSONArray("cardetails");//將json字符串轉(zhuǎn)化為JSONArray JSONObject carDetailObj = carDetailArr.getJSONObject(0);//獲取數(shù)組第一個(gè)元素 Cardetails cardetails = (Cardetails) JSONObject.toBean(carDetailObj, Cardetails.class);//封裝成bean //輸出顯示 System.out.println("******************"); System.out.println("jsonId:"+jsonId); System.out.println("title:"+title); System.out.println("bigImg:"+bigImg); System.out.println("repayFirst:"+repayFirst); System.out.println("endrepayone:"+endrepayone); System.out.println("endmonthone:"+endmonthone); System.out.println("marketprice:"+marketprice); System.out.println("cardetails:"+cardetails); }
到此這篇關(guān)于Java JSONObject與JSONArray對(duì)象案例詳解的文章就介紹到這了,更多相關(guān)Java JSONObject與JSONArray對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用Quartz無(wú)法注入Bean的問(wèn)題及解決
這篇文章主要介紹了SpringBoot使用Quartz無(wú)法注入Bean的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Java實(shí)現(xiàn)批量導(dǎo)出導(dǎo)入數(shù)據(jù)及附件文件zip包
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)批量導(dǎo)出導(dǎo)入數(shù)據(jù)及附件文件zip包的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一2022-09-09解決spring boot2集成activiti6踩過(guò)的坑
這篇文章主要介紹了解決spring boot2集成activiti6踩過(guò)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09springboot控制層傳遞參數(shù)為非必填值的操作
這篇文章主要介紹了springboot控制層傳遞參數(shù)為非必填值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10SpringBoot MockMvc單元測(cè)試的示例代碼
這篇文章主要介紹了SpringBoot MockMvc單元測(cè)試的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11如何使用BeanUtils.copyProperties進(jìn)行對(duì)象之間的屬性賦值
這篇文章主要介紹了使用BeanUtils.copyProperties進(jìn)行對(duì)象之間的屬性賦值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Springboot @Configuration @bean注解作用解析
這篇文章主要介紹了springboot @Configuration @bean注解作用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02