欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java遍歷Json的簡(jiǎn)單實(shí)例

 更新時(shí)間:2023年07月24日 10:24:35   作者:Xiao白碼  
這篇文章主要介紹了Java遍歷Json的簡(jiǎn)單實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java遍歷Json實(shí)例

記錄我在工作中遇到的問(wèn)題以及我的解決方案,問(wèn)題是:如何前端給后端的返回值中取出body內(nèi)的每一條目中的key和value?遇到這個(gè)問(wèn)題我還是毫無(wú)頭緒的,雖然聽(tīng)說(shuō)過(guò)一些非常好用的JSON工具,但是還是有點(diǎn)無(wú)從下手。

無(wú)從下手其實(shí)不可怕,可怕的是沒(méi)有思路。

1.取出返回值里的body部分

JSONObject jsonObject = JSONObject.parseObject (res).getJSONObject("body");

這里用到的是阿里巴巴的fastjson工具,引用的類是com.alibaba.fastjson.JSONObject;,會(huì)返回一個(gè)只含有body的Json對(duì)象。

2.取出每一條之中的Key和Value

//遍歷key和value
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
     System.out.println("這條JSON的Key是:"+entry.getKey()+"這條JSON的Value是:"+ entry.getValue());
}

上面的代碼會(huì)輸出jsonObject每一條Key和Value,這個(gè)循環(huán)我的大致理解就是用Map遍歷Json.entryset()的輸出對(duì)象,Json.entryset()輸出的應(yīng)該是一個(gè)set。

這樣得到輸出每一條數(shù)據(jù)的Key和Json。

遍歷處理JsonObject的內(nèi)容

目標(biāo)

遍歷jsonObject中value,value為已實(shí)例化的實(shí)體類;并載入該實(shí)體類獲取其中屬性和值,拼接成字符串。

知識(shí)點(diǎn)

1.Class類

Java程序在執(zhí)行時(shí),Java執(zhí)行時(shí)系統(tǒng)一直對(duì)全部的對(duì)象進(jìn)行所謂的執(zhí)行時(shí)類型標(biāo)識(shí)。

這項(xiàng)信息紀(jì)錄了每一個(gè)對(duì)象所屬的類。虛擬機(jī)通常使用執(zhí)行時(shí)類型信息選準(zhǔn)正確方法去執(zhí)行,用來(lái)保存這些類型信息的類是Class類。

Class類封裝一個(gè)對(duì)象和接口執(zhí)行時(shí)的狀態(tài),當(dāng)裝載類時(shí)。Class類型的對(duì)象自己主動(dòng)創(chuàng)建。Class 沒(méi)有公共構(gòu)造方法。

Class 對(duì)象是在載入類時(shí)由Java 虛擬機(jī)以及通過(guò)調(diào)用類載入器中的 defineClass 方法自己主動(dòng)構(gòu)造的,因此不能顯式地聲明一個(gè)Class對(duì)象。

虛擬機(jī)為每種類型管理一個(gè)獨(dú)一無(wú)二的Class對(duì)象。也就是說(shuō),每一個(gè)類(型)都有一個(gè)Class對(duì)象。執(zhí)行程序時(shí)。Java虛擬機(jī)(JVM)首先檢查是否所要載入的類相應(yīng)的Class對(duì)象是否已經(jīng)載入。

假設(shè)沒(méi)有載入,JVM就會(huì)依據(jù)類名查找.class文件,并將其Class對(duì)象載入。

主要的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和keyword void 也都相應(yīng)一個(gè) Class 對(duì)象。

每一個(gè)數(shù)組屬于被映射為 Class 對(duì)象的一個(gè)類,全部具有同樣元素類型和維數(shù)的數(shù)組都共享該 Class 對(duì)象。

一般某個(gè)類的Class對(duì)象被加載內(nèi)存,它就用來(lái)創(chuàng)建這個(gè)類的全部對(duì)象。

一、怎樣得到Class的對(duì)象呢?有三種方法能夠的獲取

1、調(diào)用Object類的getClass()方法來(lái)得到Class對(duì)象,這也是最常見(jiàn)的產(chǎn)生Class對(duì)象的方法。

比如:

MyObject x;
Class c1 = x.getClass();

2、使用Class類的中靜態(tài)forName()方法獲得與字符串相應(yīng)的Class對(duì)象。

比如:

Class c2=Class.forName(“MyObject”)

Employee必須是接口或者類的名字。

3、獲取Class類型對(duì)象的第三個(gè)方法很easy。假設(shè)T是一個(gè)Java類型。那么T.class就代表了匹配的類對(duì)象。

比如

Class cl1 = Manager.class;
Class cl2 = int.class;
Class cl3 = Double[].class;

注意:Class對(duì)象實(shí)際上描寫敘述的僅僅是類型。而這類型未必是類或者接口。

比如上面的int.class是一個(gè)Class類型的對(duì)象。

因?yàn)闅v史原因。數(shù)組類型的getName方法會(huì)返回奇怪的名字。

二、Class類的經(jīng)常用法

  • getName()一個(gè)Class對(duì)象描寫敘述了一個(gè)特定類的屬性,Class類中最經(jīng)常使用的方法getName以 String 的形式返回此 Class 對(duì)象所表示的實(shí)體(類、接口、數(shù)組類、基本類型或 void)名稱。
  • newInstance()Class另一個(gè)實(shí)用的方法能夠?yàn)轭悇?chuàng)建一個(gè)實(shí)例,這種方法叫做newInstance()。比如:x.getClass.newInstance(),創(chuàng)建了一個(gè)同x一樣類型的新實(shí)例。newInstance()方法調(diào)用默認(rèn)構(gòu)造器(無(wú)參數(shù)構(gòu)造器)初始化新建對(duì)象。
  • getClassLoader()返回該類的類載入器。
  • getComponentType()返回表示數(shù)組組件類型的 Class。
  • getSuperclass()返回表示此 Class 所表示的實(shí)體(類、接口、基本類型或 void)的超類的 Class。
  • isArray()判定此 Class 對(duì)象是否表示一個(gè)數(shù)組類。

三、Class的一些使用技巧

1. forName和newInstance結(jié)合起來(lái)使用,能夠依據(jù)存儲(chǔ)在字符串中的類名創(chuàng)建對(duì)象。

比如:

Object obj = Class.forName(s).newInstance();

虛擬機(jī)為每種類型管理一個(gè)獨(dú)一無(wú)二的Class對(duì)象。因此能夠使用==操作符來(lái)比較類對(duì)象。

比如:

if(e.getClass() == Employee.class)…

2. Class類的 forName、getClass、getName方法

  • Class.forName():返回與給定的字符串名稱相關(guān)聯(lián)類或接口的Class對(duì)象。
  • Class.forName("");的作用是要求JVM查找并加載指定的類,假設(shè)在類中有靜態(tài)初始化器的話,JVM必定會(huì)運(yùn)行該類的靜態(tài)代碼段。入?yún)椋篠tring className

getClass方法:

  • 類型:public final Class<? extends Object> getClass()
  • 功能:返回該對(duì)象的運(yùn)行時(shí)類的java.lang.Class對(duì)象(API上的解釋)
  • 由方法類型可以知道,該方法只能由類的實(shí)例變量調(diào)用;
  • 當(dāng)你要獲得一個(gè)類的Class對(duì)象時(shí)(作函數(shù)參數(shù)的時(shí)候),你不能調(diào)用getClass方法,那你只能用類名.class來(lái)達(dá)到效果

getName方法:

  • 類型:public String getName()
  • 功能:以String形式返回次Class對(duì)象所表示的實(shí)體名稱
JButton b1 = new JButton("button1");  
System.out.println(b1.getClass()); 

輸出:class javax.swing.JButton

JButton b1 = new JButton("button1");  
System.out.println(b1.getName());   

輸出:javax.swing.JButton可以發(fā)現(xiàn)用class屬性和getClass返回的輸出是一樣的,用getName返回的比前面兩種少了class和一個(gè)空格。

3.遍歷實(shí)體類的屬性

//java中遍歷實(shí)體類,獲取屬性名和屬性值
        public static void testReflect(Object model) throws Exception{
            for (Field field : model.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                System.out.println(field.getName() + ":" + field.get(model) );
                }
        }

4. Java創(chuàng)建對(duì)象實(shí)例的三種方法

1.new

通常都是使用java的關(guān)鍵字new來(lái)創(chuàng)建對(duì)象實(shí)例。

若有一個(gè)Something類,則可以通過(guò)下面的語(yǔ)句創(chuàng)建Something類的對(duì)象實(shí)例并指定到變量obj。

Something somethingNew = new Something();  

通過(guò)new創(chuàng)建對(duì)象實(shí)例必須把類名寫在源代碼里面。

2.clone

若程序?qū)懗扇缦拢瑒t可以根據(jù)當(dāng)前對(duì)象(this)建立一個(gè)新實(shí)例對(duì)象(沒(méi)有調(diào)用構(gòu)造函數(shù)).

public class Something implements Cloneable{  
    private Something obj;  
    public Something cloneSomething()  
    {  
        try {  
            obj = (Something)this.clone();  
//          obj = (Something)clone();  
        } catch (CloneNotSupportedException e) {  
            e.printStackTrace();  
        }  
        return obj;          
    }  
}  

如果需要復(fù)制上面的那個(gè)obj指向的對(duì)象實(shí)例時(shí),調(diào)用somethingNew.cloneSomething()方法就ok了。

但是為什么不直接使用somethingNew.clone()呢?

JDK中Object# clone()方法的原型是:

protected native Object clone() throws CloneNotSupportedException;

方法修飾符是protected,而不是public。

這種訪問(wèn)的不可見(jiàn)性使得我們對(duì)Object#clone()方法不可見(jiàn)。

所以,必需重寫Object的clone方法后才能使用。

public Object clone()throws CloneNotSupportedException  
{  
    Something obj;  
    obj= (Something)super.clone();  
    return obj;  
}  

值得注意的是 :

如果需要使用clone方法,必需實(shí)現(xiàn)java.lang.Cloneable接口,否則會(huì)拋出java.lang.CloneNotSupportedException。

另外clone方法所做的的操作是直接復(fù)制字段的內(nèi)容,換句話說(shuō),這個(gè)操作并不管該字段對(duì)應(yīng)的對(duì)象實(shí)例內(nèi)容。

像這樣字段對(duì)字段的拷貝(field to field copy)就成為"淺拷貝",clone方法所做的正是"淺拷貝".

3.newInstance

利用java.lang.Class類的newInstance方法,則可根據(jù)Class對(duì)象的實(shí)例,建立該Class所表示的類的對(duì)象實(shí)例。

創(chuàng)建Something類的對(duì)象實(shí)例可以使用下面的語(yǔ)句(這樣需要一個(gè)已經(jīng)存在的對(duì)象實(shí)例)。

somethingNew.getClass().newInstance().   
//或者使用下面的語(yǔ)句(只需要存在相應(yīng)的.class文件即可)
Something instance = (Something) Class.forName("cn.softkid.test.Something").newInstance();  
 //如果包下不存在相應(yīng).class文件,則會(huì)拋出ClassNotFoundException。

注意 :

newInstance創(chuàng)建對(duì)象實(shí)例的時(shí)候會(huì)調(diào)用無(wú)參的構(gòu)造函數(shù),所以必需確保類中有無(wú)參數(shù)的構(gòu)造函數(shù),否則將會(huì)拋出java.lang.InstantiationException異常。無(wú)法進(jìn)行實(shí)例化。

遍歷JsonObject 的內(nèi)容

 /**
     * 解析制表的getDataSource方法,獲取報(bào)表數(shù)據(jù)
     * @param reportId
     * @param branchNo
     * @return
     */
    @Override
    public String exportTXTFile(String reportId, String branchNo, String coopBranchNo, String periodDate) {
        Map<String, String> map  = new HashMap<>();
        // 根據(jù)報(bào)表xml獲取templateType
        String templateType = getTemplateTypeFromXml(reportId);
        map.put(FieldValues.REPORT_ID, reportId);
        map.put(FieldValues.BRANCH_NO, branchNo);
        map.put(FieldValues.COOP_BRANCH_NO, coopBranchNo);
        map.put(FieldValues.PERIOD_DATE, periodDate);
        map.put(FieldValues.TEMPLATE_TYPE, templateType);
        //通過(guò)制表平臺(tái)獲取報(bào)表內(nèi)容
        JSONObject jsonObject = uraReportbuilderService.getDataSource(map);
        Map<String, Object> mapContent = jsonObject;
        StringBuffer text = new StringBuffer();
        for (Object keyValue : mapContent.values()) {
            //keyValue中為ArrayList 代表該報(bào)表的DataSource(即數(shù)據(jù)庫(kù)表)中的不同行;每一行都是一個(gè)實(shí)例化后的實(shí)體類
            if (keyValue instanceof ArrayList) {
                for (int i=0; i< ((ArrayList) keyValue).size(); i++) {
                    try{
                        Class ownClass = Class.forName(((ArrayList) keyValue).get(i).getClass().getName());
                        //這里需要用getClass().getName()
                        Field[] fields = ownClass.getDeclaredFields();
                        for (Field field : fields) {
                            field.setAccessible(true);
                            text.append(field.get(((ArrayList)keyValue).get(i)));
                            text.append("|");
                        }
                        //換行
                        text.append("\r\n");
                    } catch (Exception e){
                        logger.error("讀取報(bào)表數(shù)據(jù)出錯(cuò)",e.toString());
                        return "fail";
                    }
                }
            }
        }
        return text.toString();
    }

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中的迭代和遞歸詳解

    Java中的迭代和遞歸詳解

    這篇文章主要給大家介紹了關(guān)于Java中的迭代和遞歸,文章顯示分別介紹了Java中的迭代和遞歸,而后又介紹了迭代和遞歸的區(qū)別以及數(shù)形遞歸的相關(guān)內(nèi)容,文中介紹的很詳細(xì),相信會(huì)對(duì)大家學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友們可以參考借鑒。
    2016-11-11
  • win10系統(tǒng)64位jdk1.8的下載與安裝教程圖解

    win10系統(tǒng)64位jdk1.8的下載與安裝教程圖解

    這篇文章主要介紹了win10系統(tǒng)64位jdk1.8的下載與安裝教程圖解,本文給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 老生常談比較排序之歸并排序(遞歸)

    老生常談比較排序之歸并排序(遞歸)

    下面小編就為大家?guī)?lái)一篇老生常談比較排序之歸并排序(遞歸)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • JAVA中while循環(huán)的使用與注意事項(xiàng)

    JAVA中while循環(huán)的使用與注意事項(xiàng)

    這篇文章主要介紹了while循環(huán)在編程中的應(yīng)用,包括其基本結(jié)構(gòu)、語(yǔ)句示例、適用場(chǎng)景以及注意事項(xiàng),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • Java spring AOP基礎(chǔ)

    Java spring AOP基礎(chǔ)

    本篇文章主要介紹了深入理解spring的AOP機(jī)制基礎(chǔ)原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-11-11
  • Linux安裝JDK兩種方式詳細(xì)教程(附圖)

    Linux安裝JDK兩種方式詳細(xì)教程(附圖)

    這篇文章主要給大家介紹了關(guān)于Linux安裝JDK兩種方式詳細(xì)教程的相關(guān)資料,Linux的使用相信大家都要用到j(luò)ava吧,在使用java前我們得先安裝jdk以及配置環(huán)境變量等工作,需要的朋友可以參考下
    2023-11-11
  • Java項(xiàng)目實(shí)現(xiàn)尋找迷宮出路

    Java項(xiàng)目實(shí)現(xiàn)尋找迷宮出路

    這篇文章主要為大家詳細(xì)介紹了Java項(xiàng)目實(shí)現(xiàn)尋找迷宮出路,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 如何用Springboot快速整合shiro安全框架

    如何用Springboot快速整合shiro安全框架

    這篇文章主要介紹了如何用SpringBoot快速整合shiro安全框架,shiro原名Apache Shiro 是一個(gè)Java 的安全(權(quán)限)框架。Shiro 可以非常容易的開(kāi)發(fā)出足夠好的應(yīng)用,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • java 使用poi動(dòng)態(tài)導(dǎo)出的操作

    java 使用poi動(dòng)態(tài)導(dǎo)出的操作

    這篇文章主要介紹了java 使用poi動(dòng)態(tài)導(dǎo)出的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 深入淺出的學(xué)習(xí)Java ThreadLocal

    深入淺出的學(xué)習(xí)Java ThreadLocal

    本文會(huì)基于實(shí)際場(chǎng)景介紹ThreadLocal如何使用以及內(nèi)部實(shí)現(xiàn)機(jī)制。 具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02

最新評(píng)論