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

java無限遞歸遍歷json對(duì)象問題

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

需求

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

舉一個(gè)例子

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

能夠輸出:

a->1;b.b1->2

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

方案

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

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對(duì)象
    		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對(duì)象
					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對(duì)象中的每個(gè)值,但是丟失了json結(jié)構(gòu)中key的路徑,此外對(duì)于數(shù)組接口,沒有輸出key。

對(duì)上面方法進(jìn)行優(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對(duì)象
    		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中是一個(gè)json對(duì)象
					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的每個(gè)路徑都保存了下來。

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

2、json-flatter庫(kù)

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

例如:

{ "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é)

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

相關(guān)文章

  • java線程并發(fā)blockingqueue類使用示例

    java線程并發(fā)blockingqueue類使用示例

    BlockingQueue是一種特殊的Queue,若BlockingQueue是空的,從BlockingQueue取東西的操作將會(huì)被阻斷進(jìn)入等待狀態(tài)直到BlocingkQueue進(jìn)了新貨才會(huì)被喚醒,下面是用BlockingQueue來實(shí)現(xiàn)Producer和Consumer的例子
    2014-01-01
  • 利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作

    利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作

    這篇文章主要介紹了利用JAVA反射,讀取數(shù)據(jù)庫(kù)表名,自動(dòng)生成對(duì)應(yīng)實(shí)體類的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java中HashMap的初始容量設(shè)置方式

    Java中HashMap的初始容量設(shè)置方式

    這篇文章主要介紹了Java中HashMap的初始容量設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringBoot 任務(wù)調(diào)度動(dòng)態(tài)設(shè)置方式(不用重啟服務(wù))

    SpringBoot 任務(wù)調(diào)度動(dòng)態(tài)設(shè)置方式(不用重啟服務(wù))

    這篇文章主要介紹了SpringBoot 任務(wù)調(diào)度 動(dòng)態(tài)設(shè)置方式(不用重啟服務(wù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringMvc使用GoogleKaptcha生成驗(yàn)證碼

    SpringMvc使用GoogleKaptcha生成驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了SpringMvc項(xiàng)目中使用GoogleKaptcha 生成驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java?this關(guān)鍵字的使用案例詳解

    Java?this關(guān)鍵字的使用案例詳解

    這篇文章主要為大家介紹了Java?this關(guān)鍵字的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Java實(shí)現(xiàn)貪吃蛇游戲(1小時(shí)學(xué)會(huì))

    Java實(shí)現(xiàn)貪吃蛇游戲(1小時(shí)學(xué)會(huì))

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)貪吃蛇游戲,1小時(shí)學(xué)會(huì)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Java 8 Stream.distinct() 列表去重的操作

    Java 8 Stream.distinct() 列表去重的操作

    這篇文章主要介紹了Java 8 Stream.distinct() 列表去重的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • spring boot如何添加攔截器

    spring boot如何添加攔截器

    本篇文章主要介紹了spring boot如何添加攔截器,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • IDEA自動(dòng)生成類圖和時(shí)序圖的操作指南

    IDEA自動(dòng)生成類圖和時(shí)序圖的操作指南

    idea 的強(qiáng)大之處在于此,它包含了很多小插件,我們不需要再次下載相關(guān)插件,只需要在idea中小小的設(shè)置一下就可以了,本文我介紹了IDEA自動(dòng)生成類圖和時(shí)序圖的操作指南,我用的是idea2020版本,需要的朋友可以參考下
    2024-05-05

最新評(píng)論