最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java無限遞歸遍歷json對象問題

 更新時間:2023年07月24日 11:25:54   作者:趕路人兒  
這篇文章主要介紹了java無限遞歸遍歷json對象問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

需求

給一個json字符串,遍歷json字符串,輸出其每個key對應(yīng)的value。

舉一個例子

{
    "a":1,
    "b":{
        "b1":2
    }
}

能夠輸出:

a->1;b.b1->2

上例只是為了說明問題舉得一個最簡單的json,實際應(yīng)用中json可以是嵌套非常復(fù)雜的結(jié)構(gòu)。

方案

1、采用遞歸的方法打印每個路徑上的值

static final String json_schema2 = "{\"a\":1,\"b\":{\"b1\":2},\"c\":[1,2,3,4],\"d\":{\"d1\":{\"d1_1\":100,\"d1_2\":101},\"d2\":[\"d2_1\",\"d2_2\"]},\"e\":[{\"e1\":1},{\"e2\":2}]}";
static void  analysisJson(Object objJson){
    	//如果objJson為json數(shù)組
    	if(objJson instanceof JSONArray) {
    		JSONArray objArray = (JSONArray)objJson;
			for (int i = 0; i < objArray.size(); i++) {
				analysisJson(objArray.get(i));
			}
    	} else if(objJson instanceof JSONObject) { //如果objJson為json對象
    		JSONObject jsonObject = (JSONObject)objJson;
			Iterator it = jsonObject.keySet().iterator();
			while(it.hasNext()) {
				String key = it.next().toString();
				Object value = jsonObject.get(key); //value
				if(value instanceof JSONArray) { //如果value是數(shù)組
					JSONArray objArray = (JSONArray)value;
					analysisJson(objArray);
				} else if(value instanceof JSONObject){ //如果value是json對象
					analysisJson((JSONObject)value);
				} else { //如果value是基本類型
					System.out.println("["+key+"]:"+value.toString()+" ");
				}
			}
    	} else { //objJson為基本類型
    		System.out.println(objJson.toString()+" ");
    	}
    }

輸出:

[a]:1 
[b1]:2 




[d1_1]:100 
[d1_2]:101 
d2_1 
d2_2 
[e1]:1 
[e2]:2 

上面的方法雖然可以輸出json對象中的每個值,但是丟失了json結(jié)構(gòu)中key的路徑,此外對于數(shù)組接口,沒有輸出key。

對上面方法進行優(yōu)化:

static void  analysisJson2(Object objJson,String flag) {
    	if(objJson instanceof JSONArray) {//如果obj為json數(shù)組
    		JSONArray objArray = (JSONArray)objJson;
			for (int i = 0; i < objArray.size(); i++) {
				analysisJson2(objArray.get(i),flag);
			}
    	} else if(objJson instanceof JSONObject){//如果為json對象
    		JSONObject jsonObject = (JSONObject)objJson;
			Iterator it = jsonObject.keySet().iterator();
			while(it.hasNext()) {
				String key = it.next().toString();
				Object object = jsonObject.get(key);
				//如果得到的是數(shù)組
				if(object instanceof JSONArray){
					JSONArray objArray = (JSONArray)object;
					String path = "";
					if (StringUtils.isNotBlank(flag)) {
						path = flag + "." + key;
					} else {
						path = key;
					}
					analysisJson2(objArray,path);
				} else if(object instanceof JSONObject) {//如果key中是一個json對象
					String path = "";
					if (StringUtils.isNotBlank(flag)) {
						path = flag + "." + key;
					} else {
						path = key;
					}
					analysisJson2((JSONObject)object,path);
				} else {//如果key中是其他
					String path = "";
					if (StringUtils.isNotBlank(flag)) {
						path = flag + "." + key;
					} else {
						path = key;
					}
					System.out.println(path+":"+object.toString()+" ");
				}
			}
    	} else {//如果key中是其他
			System.out.println(flag+":"+objJson.toString()+" ");
		}
    }

輸出:

a:1 
b.b1:2 
c:1 
c:2 
c:3 
c:4 
d.d1.d1_1:100 
d.d1.d1_2:101 
d.d2:d2_1 
d.d2:d2_2 
e.e1:1 
e.e2:2 

非常完美,吧json結(jié)構(gòu)中key的每個路徑都保存了下來。

但是,還是有一點點的小瑕疵,對于數(shù)組結(jié)構(gòu),沒有輸出下標值。

2、json-flatter庫

json-flatter庫可以將json結(jié)構(gòu)按照上面需求輸出,同時對于數(shù)組還能顯示下標。

例如:

{ "a":
  { "b": 1,
    "c": null,
    "d": [false, true]
  },
  "e": "f",
  "g": 2.3
}
//輸出
{ "a.b": 1,
  "a.c": null,
  "a.d[0]": false,
  "a.d[1]": true,
  "e": "f",
  "g": 2.3
}

示例:

<dependency>
	<groupId>com.github.wnameless.json</groupId>
	<artifactId>json-flattener</artifactId>
	<version>0.9.0</version>
</dependency>
String json = "{ \"a\" : { \"b\" : 1, \"c\": null, \"d\": [false, true] }, \"e\": \"f\", \"g\":2.3 }";
Map<String, Object> flattenJson = JsonFlattener.flattenAsMap(json);
System.out.println(flattenJson);
// Output: {a.b=1, a.c=null, a.d[0]=false, a.d[1]=true, e=f, g=2.3}
String jsonStr = JsonFlattener.flatten(json);
System.out.println(jsonStr);
// Output: {"a.b":1,"a.c":null,"a.d[0]":false,"a.d[1]":true,"e":"f","g":2.3}
String nestedJson = JsonUnflattener.unflatten(jsonStr);
System.out.println(nestedJson);
// {"a":{"b":1,"c":null,"d":[false,true]},"e":"f","g":2.3}
// Support JSON keys which contain dots or square brackets
String flattendJsonWithDotKey = JsonFlattener.flatten("[{\"a.a.[\":1},2,{\"c\":[3,4]}]");
System.out.println(flattendJsonWithDotKey);
// Output: {"[0][\"a.a.[\"]":12,"[1]":2,"[2].c[0]":3,"[2].c[1]":4}
String nestedJsonWithDotKey = JsonUnflattener.unflatten(
        "{\"[1][0];\":2,\"[0]\":1,\"[1][1]\":3,\"[2]\":4,\"[3][\\\"ab.c.[\\\"]\":5}");
System.out.println(nestedJsonWithDotKey);
// Output: [1,[2,3],4,{"ab.c.[":5}]

總結(jié)

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

相關(guān)文章

  • File.createTempFile創(chuàng)建臨時文件的示例詳解

    File.createTempFile創(chuàng)建臨時文件的示例詳解

    這篇文章主要介紹了File.createTempFile創(chuàng)建臨時文件的示例詳解,在默認臨時文件目錄中創(chuàng)建一個空文件,使用給定前綴和后綴生成其名稱。 如果感興趣來了解一下
    2020-07-07
  • 解析分別用遞歸與循環(huán)的方式求斐波那契數(shù)列的實現(xiàn)方法

    解析分別用遞歸與循環(huán)的方式求斐波那契數(shù)列的實現(xiàn)方法

    本篇文章是對分別用遞歸與循環(huán)的方式求斐波那契數(shù)列的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • mybatis框架入門學(xué)習(xí)教程

    mybatis框架入門學(xué)習(xí)教程

    MyBatis是一個支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。這篇文章主要介紹了mybatis框架入門學(xué)習(xí)教程,需要的朋友可以參考下
    2017-02-02
  • Java面向?qū)ο笾饔糜蛟敿毥庾x

    Java面向?qū)ο笾饔糜蛟敿毥庾x

    這篇文章主要介紹了Java面向?qū)ο笾饔糜蛟敿毥庾x,在java編程中,主要的變量就是屬性和局部變量,局部變量一般是指在成員方法中定義的變量,局部變量也就是除了屬性之外的其他變量,作用域為定義他的代碼塊中,需要的朋友可以參考下
    2024-01-01
  • 一篇文章帶你入門Java運算符

    一篇文章帶你入門Java運算符

    這篇文章主要介紹了Java基本數(shù)據(jù)類型和運算符,結(jié)合實例形式詳細分析了java基本數(shù)據(jù)類型、數(shù)據(jù)類型轉(zhuǎn)換、算術(shù)運算符、邏輯運算符等相關(guān)原理與操作技巧,需要的朋友可以參考下
    2021-08-08
  • java制作仿微信錄制小視頻控件

    java制作仿微信錄制小視頻控件

    這篇文章主要介紹了java制作仿微信錄制小視頻控件的代碼,錄制小視頻非常方便,有需要的小伙伴可以參考下。
    2015-04-04
  • 解決JDK8的ParallelStream遍歷無序的問題

    解決JDK8的ParallelStream遍歷無序的問題

    這篇文章主要介紹了解決JDK8的ParallelStream遍歷無序的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Springboot實現(xiàn)根據(jù)條件切換注入不同實現(xiàn)類的示例代碼

    Springboot實現(xiàn)根據(jù)條件切換注入不同實現(xiàn)類的示例代碼

    這篇文章主要介紹了Springboot實現(xiàn)根據(jù)條件切換注入不同實現(xiàn)類的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java中Dom4j的配置與使用示例詳解

    Java中Dom4j的配置與使用示例詳解

    Dom4j是一個強大的Java庫,用于處理XML數(shù)據(jù),結(jié)合了DOM、SAX、JDOM的優(yōu)點,它可以解析、生成、修改和序列化XML文檔,適用于數(shù)據(jù)交換、配置文件管理、日志記錄、數(shù)據(jù)持久化和Web服務(wù)等場景,Dom4j提供了簡單易用的API,便于開發(fā)者進行高效的XML操作
    2024-10-10
  • macOS下Spring Boot開發(fā)環(huán)境搭建教程

    macOS下Spring Boot開發(fā)環(huán)境搭建教程

    這篇文章主要為大家詳細介紹了macOS下Spring Boot開發(fā)環(huán)境搭建教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

兴化市| 拉萨市| 咸丰县| 射洪县| 观塘区| 安义县| 边坝县| 新平| 闽清县| 京山县| 左权县| 法库县| 英超| 紫云| 香港 | 阿拉善左旗| 凌源市| 河北省| 右玉县| 宾阳县| 正定县| 铁力市| 商南县| 前郭尔| 平昌县| 永靖县| 银川市| 盘山县| 格尔木市| 中江县| 宕昌县| 隆昌县| 喜德县| 噶尔县| 华阴市| 仁布县| 吐鲁番市| 岗巴县| 广丰县| 凤翔县| 大渡口区|