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

您所在的位置:网站首页 flattener 利用Gson对json进行flatten(扁平化)处理

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

#利用Gson对json进行flatten(扁平化)处理| 来源: 网络整理| 查看: 265

目录

一.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的依赖包,如下:

com.google.code.gson gson 2.8.5

二.通过构建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 keys =(Iterator) 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; } }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3