Java JSONObject與JSONArray對象案例詳解
JSONObject與JSONArray
最近在學(xué)習(xí)過程中用到了稍微復(fù)雜點(diǎn)的json數(shù)據(jù)需要將json數(shù)據(jù)解析出來,這里就截取一部分作為例子
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":"國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無級(jí)變速",
"caremission":"國V",
"carldone":"定制輪轂",
"carldtwo":"多功能方向盤",
"carldthree":"LED尾燈",
"carldfour":"真皮座椅"
}] } ]
}
面對這樣數(shù)組與對象相互嵌套的情況需要一步步將數(shù)據(jù)拆分,主要思想還是根據(jù)鍵取值,對于數(shù)組類型還是需要先根據(jù)”下標(biāo)”取出元素。這里還需要用到JSONObject與JSONArray。
將上面的json數(shù)據(jù)簡化就是:(這里保留個(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"}] }
]
}
這就是簡化了的json數(shù)據(jù),可以看出這個(gè)串最外層是一個(gè)大的鍵為cartypes的對象,而它的值是json數(shù)組形式的比較復(fù)雜的json數(shù)據(jù)。繼續(xù)分析 [ ]的部分,可以看到,里面有兩個(gè)數(shù)組元素,每個(gè)元素分別是被{ }包起來的json對象,他們的元素組成相同,再看每個(gè)元素里面包含幾個(gè)鍵值對的數(shù)據(jù),其中鍵cardetails的值又是一個(gè)嵌套的json數(shù)組,里面包含一個(gè)json對象。分析完畢。那該怎樣才能(拿到數(shù)據(jù))解析呢?
使用JSONObject與JSONArray
一般取數(shù)據(jù)有兩種方式,看需要選擇。
方式①:
通過 JSONObject.getString("鍵")直接獲取,這種方式只能每次獲取一個(gè)。
方式②
通過構(gòu)建與json對象相應(yīng)的bean來獲取。
我在寫上面的例子時(shí)用到了兩種方式,由于需要使用到 id,bigimg以及cardetails中的大部分?jǐn)?shù)據(jù),因此我在使用時(shí)將cardetails封裝成一個(gè)bean,方便使用,而其他用到的比較少,因此就直接根據(jù)鍵獲取值。
另外需要注意的是,JSONObject,JSONArray分別對應(yīng)的是json數(shù)據(jù)的兩種格式。即{"張三" : "男"} , [{ 張三" : " 男" }] ,使用時(shí)需要將其轉(zhuǎn)換成對應(yīng)的對象。
如(示例):
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"); //通過getString("cartypes")取出里面的信息
JSONArray jsonArray = JSONArray.fromObject(cartypes); //將取到的cartypes對應(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");//通過getString("cartypes")取出里面的信息
JSONArray jsonArray = JSONArray.fromObject(cartypes); //將取到的cartypes對應(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è)對象轉(zhuǎn)成json對象
jsonId=(int)job.get("id"); //得到每個(gè)對象中的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對象案例詳解的文章就介紹到這了,更多相關(guān)Java JSONObject與JSONArray對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
區(qū)分Java中的ArrayList和LinkedList
這篇文章主要介紹了如何區(qū)分Java中ArrayList和LinkedList,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
501 Command "HELO" requires an argument問題的解決方法
換一個(gè)windows服務(wù)器,發(fā)現(xiàn)就沒這樣的問題,僅在一臺(tái)Linux服務(wù)器上可以重現(xiàn),直觀感覺就是這臺(tái)Linux服務(wù)器某些配置有問題2013-08-08
Java HtmlEmail 郵件發(fā)送的簡單實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄狫ava HtmlEmail 郵件發(fā)送的簡單實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06
Java?Date(日期)對象進(jìn)行格式化的思路詳解
Date類是經(jīng)常會(huì)使用到的一個(gè)用來處理日期、時(shí)間的一個(gè)類。Date類是在java.util包下的Date類,這篇文章主要介紹了Java?Date(日期)對象如何進(jìn)行格式化呢,需要的朋友可以參考下2022-09-09
feign客戶端HTTP狀態(tài)碼為204時(shí)?響應(yīng)體被忽略的問題
這篇文章主要介紹了feign客戶端HTTP狀態(tài)碼為204時(shí)?響應(yīng)體被忽略的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringBoot配置文件導(dǎo)入方法詳細(xì)講解
Spring Boot雖然是Spring的衍生物, 但默認(rèn)情況下Boot是不能直接使用Spring的配置文件的, 我們可以通過兩種方式導(dǎo)入Spring的配置2022-10-10
Bean?Searcher配合SpringBoot的使用詳解
這篇文章主要介紹了Bean?Searcher配合SpringBoot的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
SpringKafka消息發(fā)布之KafkaTemplate與事務(wù)支持功能
通過本文介紹的基本用法、序列化選項(xiàng)、事務(wù)支持、錯(cuò)誤處理和性能優(yōu)化技術(shù),開發(fā)者可以構(gòu)建高效可靠的Kafka消息發(fā)布系統(tǒng),事務(wù)支持特性尤為重要,它確保了在分布式環(huán)境中的數(shù)據(jù)一致性,感興趣的朋友一起看看吧2025-04-04

