利用Gson对json进行flatten(扁平化)处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/studyhard232/article/details/81202449

目录

一.Gson的简单介绍

二.通过构建json树实现两层json的解析

三.通过递归实现多层json的解析


一.Gson的简单介绍

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树,可以在遍历过程中,不必指定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进行了扁平化处理,可以应对嵌套多层的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;
    }


}

 

没有更多推荐了,返回首页