1. 程式人生 > >利用Gson對json進行flatten(扁平化)處理

利用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;
    }


}

相關推薦

利用Gsonjson進行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樣本進行歸一處理

 資料歸一化處理是資料探勘中一項基本的工作,不同評價指標往往具有不同的量綱和量綱單位,這樣 的情況會影響到資料分析的結果,為了消除指標之間量綱的影響,需要進行資料標準化處理,以解決 資料指標之間的可比性。例如要求解距離(歐氏距離等),需要平方和操作,非常小的數貢獻很小,反之大的

利用GsonJSON數據進行格式化(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結合某

利用TICKDocker進行視覺監控

效能監控是容器服務必不可少的基礎設施,容器化應用運行於宿主機上,我們需要知道該容器的執行情況,包括 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)_使用pythonJson進行操作

封裝 family name com src 技術分享 init with elf 如何使用Python對excel進行簡單的操作,這個對接口自動化測試很重要 一. 準備一份Json文檔,如下格式: { "register":{"mobile":"15500000090"}

不同局域網如何利用charlesapp進行抓包

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利用ORMMysql進行查表的語句

一: all()  返回模型類對應表格中所有的資料。 二:get():返回表格中滿足條件的一條資料,如果查到多條資料,則拋異常:MultipleObjectsReturned,查詢不到資料,則拋異常:DoesNotExist。 三:filter():引數寫查詢條件,返回滿足條件 Q

利用物件陣列進行去重排序

第一家公司: 上海莘亮網路科技有限公司 問題:1資料內嵌瞭解多少             2.熟悉php框架thinkcmf      &nb

C#利用NPOIExcel進行基本操作

C#利用NPOI操作Excel詳解 一、 下載npoi控制元件,並進行引用。 1.下載地址: 2.引用npoi (1)、下載後的npoi包括5個dll檔案: (2)、下載完成之後首先建立一個控制檯程式,然後在視圖裡面,調出解決方案資源管理器,點選“引用”>

利用asmjar進行修改

一.導讀 有些時候,需要對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