java多層嵌套集合的json,如何獲取多層集合中所需要的value


就很簡單的一個問題折磨了整整一天,好在壓抑的心情終於釋放了,終於閑下來覺得是不是應該記錄一下。

首先這個json串是從外網接口返回的數據,想要了解的朋友們可以復制到json解析器中看一下格式:https://www.json.cn/#

 

{"status":"True","biz_result":[{"PartyFunctionCode":"NBEPORT","PartyIdentifier":"container","PartyName":"寧波電子口岸","ManifestInfo":[{"LadingBillNumber":"COSU6224023460B","ShippingCompanyName":"","VesselNameCode":"COSCO YINGKOU","VesselName":"COSCO YINGKOU","PlaceOfLoading":"","PlaceOfDischarge":"","VoyageNumber":"130W","DirectionCode":"","VesselCallNumber":"","IMONumber":""}],"ContainerInfo":[{"ContainerNumber":"FCIU9840537","ContainerOperator":"COS","SealNumber":"11374417","CodeOfSizeAndType":"","ContainerLoadingStatusCode":"","ContainerTareWeight":"0","TransportMeansType":"","VehicleNumber":"","ContainerStatusInformation":[{"ImExIdentifier":"","TransportStatusCode":"碼頭已經放行","TransportStatusNameEN":"","DateOrTimeOrPeriod":"2019-10-25 17:34:49","TimeZoneIdentifier":"PRC","PlaceLocationQualifier":"NBEPORT","PlaceOrLocationIdentification":"","PlaceOrLocation":"","Remark":"寧波電子口岸","Status":"DOCKPASS","EventName":""},{"ImExIdentifier":"E","TransportStatusCode":"重箱進港","TransportStatusNameEN":"","DateOrTimeOrPeriod":"2019-10-24 13:29:00","TimeZoneIdentifier":"PRC","PlaceLocationQualifier":"NBEPORT","PlaceOrLocationIdentification":"BLCT3","PlaceOrLocation":"北侖四期碼頭","Remark":"寧波電子口岸","Status":"INOUT","EventName":"進港"},{"ImExIdentifier":"E","TransportStatusCode":"海關放行","TransportStatusNameEN":"","DateOrTimeOrPeriod":"2019-10-25 11:04:37","TimeZoneIdentifier":"PRC","PlaceLocationQualifier":"NBEPORT","PlaceOrLocationIdentification":"","PlaceOrLocation":"","Remark":"寧波電子口岸","Status":"CUSPASS","EventName":"海關放行"},{"ImExIdentifier":"","TransportStatusCode":"27301 裝載艙單數據傳輸成功。","TransportStatusNameEN":"","DateOrTimeOrPeriod":"2019-10-31 13:44:41","TimeZoneIdentifier":"PRC","PlaceLocationQualifier":"NBEPORT","PlaceOrLocationIdentification":"","PlaceOrLocation":"","Remark":"寧波電子口岸","Status":"MFT","EventName":"裝載艙單"},{"ImExIdentifier":"E","TransportStatusCode":"重箱裝船","TransportStatusNameEN":"","DateOrTimeOrPeriod":"2019-11-01 16:13:00","TimeZoneIdentifier":"PRC","PlaceLocationQualifier":"NBEPORT","PlaceOrLocationIdentification":"BLCT3","PlaceOrLocation":"北侖四期碼頭","Remark":"寧波電子口岸","Status":"LOAD","EventName":"裝船"},{"ImExIdentifier":"","TransportStatusCode":"開船","TransportStatusNameEN":"","DateOrTimeOrPeriod":"2019-11-01 22:00:00","TimeZoneIdentifier":"PRC","PlaceLocationQualifier":"NBEPORT","PlaceOrLocationIdentification":"BLCT3","PlaceOrLocation":"北侖四期碼頭","Remark":"寧波電子口岸","Status":"BERTH","EventName":"離港"}]}]},{"PartyFunctionCode":"NBEPORT","PartyIdentifier":"container","PartyName":"寧波電子口岸","ManifestInfo":[{"LadingBillNumber":"COSU6224023460A","ShippingCompanyName":"","VesselNameCode":"COSCO YINGKOU","VesselName":"COSCO YINGKOU","PlaceOfLoading":"","PlaceOfDischarge":"","VoyageNumber":"130W","DirectionCode":"","VesselCallNumber":"","IMONumber":""}],"ContainerInfo":[{"ContainerNumber":"FCIU9840537","ContainerOperator":"COS","SealNumber":"11374417","CodeOfSizeAndType":"","ContainerLoadingStatusCode":"","ContainerTareWeight":"0","TransportMeansType":"","VehicleNumber":"","ContainerStatusInformation":[{"ImExIdentifier":"","TransportStatusCode":"碼頭已經放行","TransportStatusNameEN":"","DateOrTimeOrPeriod":"2019-10-25 17:34:49","TimeZoneIdentifier":"PRC","PlaceLocationQualifier":"NBEPORT","PlaceOrLocationIdentification":"","PlaceOrLocation":"","Remark":"寧波電子口岸","Status":"DOCKPASS","EventName":""},{"ImExIdentifier":"E","TransportStatusCode":"重箱進港","TransportStatusNameEN":"","DateOrTimeOrPeriod":"2019-10-24 13:29:00","TimeZoneIdentifier":"PRC","PlaceLocationQualifier":"NBEPORT","PlaceOrLocationIdentification":"BLCT3","PlaceOrLocation":"北侖四期碼頭","Remark":"寧波電子口岸","Status":"INOUT","EventName":"進港"},{"ImExIdentifier":"E","TransportStatusCode":"海關放行","TransportStatusNameEN":"","DateOrTimeOrPeriod":"2019-10-25 11:04:27","TimeZoneIdentifier":"PRC","PlaceLocationQualifier":"NBEPORT","PlaceOrLocationIdentification":"","PlaceOrLocation":"","Remark":"寧波電子口岸","Status":"CUSPASS","EventName":"海關放行"},{"ImExIdentifier":"","TransportStatusCode":"27301 裝載艙單數據傳輸成功。","TransportStatusNameEN":"","DateOrTimeOrPeriod":"2019-10-31 13:44:41","TimeZoneIdentifier":"PRC","PlaceLocationQualifier":"NBEPORT","PlaceOrLocationIdentification":"","PlaceOrLocation":"","Remark":"寧波電子口岸","Status":"MFT","EventName":"裝載艙單"},{"ImExIdentifier":"E","TransportStatusCode":"重箱裝船","TransportStatusNameEN":"","DateOrTimeOrPeriod":"2019-11-01 16:13:00","TimeZoneIdentifier":"PRC","PlaceLocationQualifier":"NBEPORT","PlaceOrLocationIdentification":"BLCT3","PlaceOrLocation":"北侖四期碼頭","Remark":"寧波電子口岸","Status":"LOAD","EventName":"裝船"}]}]}],"error":""}
Json串

 

期間用了alibab的fastjson包想要一層一層剝開這個json,結果浪費了許多時間還是沒有效果,估計是方法使用錯了,這里就直接貼上成功的方法。

首先還是先建了實體類,這里比較簡單,就是按照json的格式一層一層往下寫,就直接貼代碼了。(getset和構造器我就不貼了,有點太占空間了)

 

 1 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 2 import java.io.Serializable;
 3 import java.util.List;
 4 
 5 @JsonIgnoreProperties(ignoreUnknown = true)
 6 @SuppressWarnings("serial")
 7 public class Result implements Serializable {
 8 
 9     private String status;
10     private List<biz_result> biz_result;
11     private String error;
 1 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 2 import java.io.Serializable;
 3 import java.util.List;
 4 
 5 @JsonIgnoreProperties(ignoreUnknown = true)
 6 @SuppressWarnings("serial")
 7 public class biz_result implements Serializable {
 8     private String PartyFunctionCode;
 9     private String PartyIdentifier;
10     private String PartyName;
11     private List<ManifestInfo> ManifestInfo ;
12     private List<ContainerInfo> ContainerInfo ;
  1 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  2 import java.io.Serializable;
  3 
  4 @JsonIgnoreProperties(ignoreUnknown = true)
  5 @SuppressWarnings("serial")
  6 public class ManifestInfo implements Serializable {
  7     private String LadingBillNumber;
  8     private String ShippingCompanyName;
  9     private String VesselNameCode;
 10     private String VesselName;
 11     private String PlaceOfLoading;
 12     private String PlaceOfDischarge;
 13     private String VoyageNumber;
 14     private String DirectionCode;
 15     private String VesselCallNumber;
 16     private String IMONumber;
  1 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  2 import java.io.Serializable;
  3 import java.util.List;
  4 
  5 @JsonIgnoreProperties(ignoreUnknown = true)
  6 @SuppressWarnings("serial")
  7 public class ContainerInfo  implements Serializable {
  8 
  9     private String ContainerNumber;
 10     private String ContainerOperator;
 11     private String SealNumber;
 12     private String CodeOfSizeAndType;
 13     private String ContainerLoadingStatusCode;
 14     private String ContainerTareWeight;
 15     private String TransportMeansType;
 16     private String VehicleNumber;
 17     private List<ContainerStatusInformation> ContainerStatusInformation ;
  1 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  2 import java.io.Serializable;
  3 
  4 @JsonIgnoreProperties(ignoreUnknown = true)
  5 @SuppressWarnings("serial")
  6 public class ContainerStatusInformation implements Serializable {
  7 
  8     private String ImExIdentifier;
  9     private String TransportStatusCode;
 10     private String TransportStatusNameEN;
 11     private String DateOrTimeOrPeriod;
 12     private String TimeZoneIdentifier;
 13     private String PlaceLocationQualifier;
 14     private String PlaceOrLocationIdentification;
 15     private String PlaceOrLocation;
 16     private String Remark;
 17     private String Status;
 18     private String EventName;

才想起來要不要折疊一下,這會不會太長了,但是我實在太懶了,對不起我就不去重新操作了。

實體類建完以后我就嘗試了一下,也不再使用alibab的fastjson,使用如下這個包:

import net.sf.json.JSONObject;

maven依賴如下:

<dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
</dependency>

最終代碼如下:

 1 import net.sf.json.JSONArray;
 2 import net.sf.json.JSONObject;
 3 
 4 public class Test02 {
 5 
 6     public static void main(String[]args){
 7 
 8         String json = "這是上面巨長的JSON";
 9 
10         //得到json對象
11         JSONObject jsonObject = JSONObject.fromObject(json);
12         //獲取其中的biz_result數組
13         JSONArray biz_result = jsonObject.getJSONArray("biz_result");
14         //獲取數組中的某位元素
15         String biz_resultString = biz_result.getString(0);
16         //將數組中的這個數組再次轉換成json對象
17         JSONObject jsonObject1 = JSONObject.fromObject(biz_resultString);
18         //通過getString獲取value
19         String manifestInfo = jsonObject1.getString("ManifestInfo");
20         //去除首位中括號得到json格式
21         String substring = manifestInfo.substring(1);
22         String subString = substring.substring(0,substring.length()-1);
23         //得到json格式以后再轉換成json對象
24         JSONObject jb3 = JSONObject.fromObject(subString);
25         //得到需要的值。
26         String vesselName = jb3.getString("VesselName");
27         System.out.println(vesselName);
28 
29     }
30 }

 

還是得養成寫注釋的習慣,要是不寫注釋貼上來,我自己都看着不舒服,最終得到了需要的數據:

COSCO YINGKOU

 

1234567.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM