利用Gson對json進行flatten(扁平化)處理
目錄
Gson是Google釋出的一個處理json的java庫。通過使用Gson可以將java物件序列化為json字串,或是將json字串反序列化為java物件。
在Gson中,JsonElement是抽象類,由JsonObject、JsonArray、JsonPrimitive和JsonNull四個類繼承。其中JsonObject類代表在json中的一個object型別,這個類最常用,可以新增鍵值對成員,可以通過利用entrySet對JsonObject的物件進行遍歷、取鍵和取值等操作。JsonArray類代表在json中的一個數組型別,可以通過迭代器遍歷JsonArray物件。JsonPrimitive類代表在json中的一個原始值,該原始值可以是String型別,java primitive或是java的原始包裝型別。JsonNull代表在json中的一個null值。
另外如果使用Maven管理Gson,需要在pom.xml中匯入gson的依賴包,如下:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
通過構建json樹,可以在遍歷過程中,不必指定json鍵值對的鍵,這樣的解析程式碼可以處理各種格式的json檔案。
import com.google.gson.*; import org.apache.commons.collections.iterators.EntrySetMapIterator; import java.util.Map; public class Main { public static void main(String[] args) throws Exception { String str = "{\"valueName1\":{\"firstname\":\"timi\",\"lastname\":\"James\"},\"age\":\"6\",\"edu\":\"SDU\"}"; JsonParser parser = new JsonParser(); JsonElement tree = parser.parse(str);//構建json樹 //System.out.println(tree.isJsonObject());//true JsonObject jo = (JsonObject)tree;//強制轉換的目的是之後可以使用entrySet //System.out.println(jo.keySet()); //System.out.println(jo.entrySet()); for(Map.Entry entry : jo.entrySet()){//遍歷構建的json樹 JsonElement tmpValue = (JsonElement) entry.getValue(); if(tmpValue.isJsonObject()){ //將取出的鍵值對的值進行判定,如果值是JsonObject型別,說明內部嵌套了鍵值對,所以需要進一步處理 JsonObject jo1 = (JsonObject)tmpValue; for(Map.Entry entry1 : jo1.entrySet()){ //遍歷第二層的json鍵值對 System.out.println(entry1.getKey()); System.out.println(entry1.getValue().toString()); System.out.println("---------------"); } }else { //處理沒有巢狀的json鍵值對 System.out.println(entry.getKey()); System.out.println(entry.getValue()); System.out.println("---------------"); } } System.out.println("++++--------------------++++++++"); } }
通過遞迴,將json進行了扁平化處理,可以應對巢狀多層的json資料。
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonIOException;
import java.util.Map;
public class FlattenJson {
public static void main(String[] args) {
String str = "{\"valueName1\":{\"firstname\":{\"oldname\":\"timi\",\"newname\":\"tim\"},\"lastname\":\"James\"},\"age\":\"33\",\"edu\":\"tim\"}";
JsonParser parser = new JsonParser();
JsonElement tree = parser.parse(str);
//System.out.println(tree.isJsonObject());//true
JsonObject jo = (JsonObject)tree;
JsonObject fa = new JsonObject();
String father = "";
//System.out.println(flatten(jo,fa,father));
JsonObject resultJo = flatten(jo,fa,father);
for(Map.Entry entry : resultJo.entrySet()){
System.out.println(entry.getKey().toString());
System.out.println(entry.getValue().toString());
}
}
private static JsonObject flatten(JsonObject object, JsonObject flattened, String father){
//flatten遞迴函式實現對多層json的扁平化處理解析,第三個形參僅僅用來保留外層的鍵並在之後進行拼接
if(flattened == null){
flattened = new JsonObject();
}
// Iterator<String> keys =(Iterator<String>) object.keySet();
for(Map.Entry entry : object.entrySet()){
String midFather = entry.getKey().toString();
String tmp = father;
JsonElement tmpVa = (JsonElement) entry.getValue();
try{
if(tmpVa.isJsonObject()){
//檢測到多層json的時候進行遞迴處理
tmp = tmp +"." + midFather;//當前層鍵與之前外層鍵進行拼接
//System.out.println("aaa"+entry.getKey().toString()+"--------"+tmp);
flatten(object.getAsJsonObject(entry.getKey().toString()),flattened,tmp);
} else {
//當前層的值沒有巢狀json鍵值對,直接將鍵值對新增到flattened中
String nowKeyTmp = father + "." + entry.getKey().toString();
String nowKey = nowKeyTmp.substring(1,nowKeyTmp.length());
flattened.add(nowKey,((JsonElement) entry.getValue()));
}
} catch (JsonIOException e) {
System.out.println(e);
}
}
return flattened;
}
}
相關推薦
利用Gson對json進行flatten(扁平化)處理
目錄 Gson是Google釋出的一個處理json的java庫。通過使用Gson可以將java物件序列化為json字串,或是將json字串反序列化為java物件。 在Gson中,JsonElement是抽象類,由JsonObject、JsonArray、J
利用opencv對影象進行二值化處理
利用該方法對圖形進行二值化處理,能夠很好的除去光線對圖片的影響 #include<iostream> #include<opencv2\opencv.hpp> using namespace cv; using namespace
利用numpy對矩陣進行歸一化處理的方法
本文不講歸一化原理,只介紹實現(事實上看了程式碼就會懂原理),程式碼如下: def Normalize(data): m = np.mean(data) mx = max(dat
python對樣本進行歸一化處理
資料歸一化處理是資料探勘中一項基本的工作,不同評價指標往往具有不同的量綱和量綱單位,這樣 的情況會影響到資料分析的結果,為了消除指標之間量綱的影響,需要進行資料標準化處理,以解決 資料指標之間的可比性。例如要求解距離(歐氏距離等),需要平方和操作,非常小的數貢獻很小,反之大的
利用Gson將JSON數據進行格式化(pretty print)
div pretty string類型 overflow jsonp creat () one ons 我們可以利用Gson包將String類型的JSON數據進行格式化。 Gson gson = new GsonBuilder().setPrettyPrinting().
[Jackson] 使用ObjectMapper對含有任意key的JSON進行反序列化
使用ObjectMapper對含有任意key的JSON進行反序列化 在呼叫某個RESTful API後,返回的JSON字串中含有沒有預先定義的key,和結構固定的JSON相比,它需要一些額外的操作。 對於結構固定的JSON,使用ObjectMapper結合某
利用TICK對Docker進行視覺化監控
效能監控是容器服務必不可少的基礎設施,容器化應用運行於宿主機上,我們需要知道該容器的執行情況,包括 CPU使用率、記憶體佔用、網路狀況以及磁碟空間等等一系列資訊。本文通過TICK 的技術棧方案實現Docker的效能監控。 一、監控結構 Telegraf:
c# 中 利用 CookieContainer 對 Cookie 進行序列化和反序列化校驗
pre code ads domain sga pdb spa ner main private void Form1_Load(object sender, EventArgs e) { var cookieStr = @"
接口自動化測試Python(3)_使用python對Json進行操作
封裝 family name com src 技術分享 init with elf 如何使用Python對excel進行簡單的操作,這個對接口自動化測試很重要 一. 準備一份Json文檔,如下格式: { "register":{"mobile":"15500000090"}
不同局域網如何利用charles對app進行抓包
app 設置 沒有 抓包 lan 服務 src 文章 移動 晚上遇到了一種尷尬的場景:電腦並沒有無線網卡,電腦是通過有線連接的,但是手機連的是公共的wifi,二者並不在同一個網段 在試過很多辦法無解後,終於百度出一種"曲線救國"的辦法(以榮耀8為例,其他手機可能有稍微改變
利用木馬對windows進行滲透
本實驗在虛擬機器環境下進行!!! 準備: Kali ip: 192.168.0.107 Win7帶office2010 &
對json進行排序處理
private String getSortJson(JSONObject json) { Set<String> set = json.keySet(); List<String> list = new ArrayList<>(); list.addAl
Django中models利用ORM對Mysql進行查表的語句
一: all() 返回模型類對應表格中所有的資料。 二:get():返回表格中滿足條件的一條資料,如果查到多條資料,則拋異常:MultipleObjectsReturned,查詢不到資料,則拋異常:DoesNotExist。 三:filter():引數寫查詢條件,返回滿足條件 Q
利用物件對陣列進行去重排序
第一家公司: 上海莘亮網路科技有限公司 問題:1資料內嵌瞭解多少 2.熟悉php框架thinkcmf &nb
C#利用NPOI對Excel進行基本操作
C#利用NPOI操作Excel詳解 一、 下載npoi控制元件,並進行引用。 1.下載地址: 2.引用npoi (1)、下載後的npoi包括5個dll檔案: (2)、下載完成之後首先建立一個控制檯程式,然後在視圖裡面,調出解決方案資源管理器,點選“引用”>
利用asm對jar進行修改
一.導讀 有些時候,需要對jar進行修改,並加入一些“自定義”的程式碼,利用asm工具就可以到。 二.流程圖 三.操作 步驟1,2 直接跳過了,這裡從步驟3開始講。首先需要Idea中安裝一個外掛Asm
windows 下利用 Charles 對手機進行抓包(https)
前提條件:手機和電腦必須在同一個區域網內 1、電腦上下載 Charles ,自行百度,無需破解 2、安裝,一直下一步就好。無特別說明,安裝好之後,logo是一個花瓶模樣 3、開啟Charles,如下圖 4、對Charles進行設定,如下圖 ,點選順序為 Pr
利用word2vec對關鍵詞進行聚類
繼上次提取關鍵詞之後,專案組長又要求我對關鍵詞進行聚類。說實話,我不太明白對關鍵詞聚類跟新聞推薦有什麼聯絡,不過他說什麼我照做就是了。按照一般的思路,可以用新聞ID向量來表示某個關鍵詞,這就像廣告推薦系統裡面用使用者訪問類別向量來表示使用者一樣,然後就可以用kmeans的方法進
為什麼要對資料進行歸一化?
為什麼要歸一化 1、提高梯度下降法求解最優解的速度 如下圖所示,藍色的圈圈圖代表的是兩個特徵的等高線。其中左圖兩個特徵X1和X2的區間相差非常大,X1區間是[0,2000],X2區間是[1,5],其所形成的等高線非常尖。當使用梯度下降法尋求最優解時,很有可能走“
【java小程式】利用ffmpeg對視訊進行截圖操作
ffmpeg程式對視訊進行的截圖的命令如下語法如下: ffmpeg.exe -ss 00:00:01 -i spring.mp4 -vframes 1 bb.jpg 00:00:01 擷取視訊圖片的時間。 spring.map4 需要擷取的視訊名稱。 1