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

Apache NIFI FlattenJson 描述: 该处理器为用户提供了获取嵌套JSON文档,并将其平展成简单的键/值对文档的能力。json的键在每一层与用户定义分隔符(默认为'.')组合。支持三种flatten模式,normal,keep arrays和针对MongoDB查询dot notation。默认的flatten模式是“keep-arrays”。 属性配置: 在下面的列表中,必需属性的名称以粗体显示。... 阅读详情

目录

一.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;
    }


}

 

JSON数组解析全攻略:从基础概念到高性能实战 JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,其核心数据结构之一便是JSON数组。它通过有序集合的形式,高效承载列表数据,是Web API和前后端通信的事实标准。从原理上看,JSON数组解析本质上是将文本格式的序列化数据,转换为编程语言中的原生数据结构(如JavaScript的Array、Python的list)。这一过程的技术价值在于,它直接关系到应用程序的数据处理效率、稳定性和安全性。在实际的工程实践中,开发者需要应对不同场景:从基础的API响应解析,到处 阅读详情

相关推荐

【信息科学与工程学】【数据科学】 第四十四篇 数据湖 系列二 函数库01

2. 近似最近邻搜索(ANN): 通过HNSW等图索引模型加速,模型定义为构建一个层次化导航小世界图。依赖于消息队列(Kafka/Pulsar)、分布式文件系统(HDFS/S3)的客户端及连接库。依赖专门的向量检索库(如FAISS, Milvus)。管控目标: 召回率(Recall@K) > 95%,查询延迟 < 100ms。管控目标: < 1% (核心业务字段) 或 < 5% (一般字段)依赖数据处理框架(如Spark, Pandas)的核心统计函数。,通过牺牲精确性(ANN)来换取搜索速度的大幅提升。

weixin_49199313的博客 346

Java:JSON扁平化和去扁平化

今天小编在github上发现了一个比较好的JSON扁平化和去扁平化处理方法,话不多说,直接开干。 1、扁平化数据(网上找的一json大串) "{\"type\":10,\"data\":[{\"text\":\"献给爱我们的女神\",\"is_liked\":false,\"index_cover\":\"http://photos.breadtrip.com/photo_d_2016_06_...

拾荒追逐者的博客 6831

JSON转换器实战:从脏数据解析到批量格式转换

在数据处理与接口对接中,JSON作为最通用的数据交换格式,其解析与格式化效率直接影响工程交付质量。然而实际生产环境中的JSON往往包含JSONP包裹、单引号、尾逗号等“脏数据”,且存在嵌套层级深、类型混乱、编码不一致等问题。理解容错解析、递归扁平化、类型强制转换等核心原理,能够帮助开发者构建本地化、批量化的数据清洗能力。基于Python标准库实现的命令行工具,提供了从JSON格式化、压缩、YAML互转,到扁平化导出CSV的完整链路,同时支持多进程并行处理数千个文件,适用于后端开发、爬虫工程及数据清洗场景。围

weixin_33795743的博客 347

利用递归实现JSON扁平化

JSON扁平化处理数据

SimpleSimpleSimples的博客 968

flatten:一个简单的命令行实用程序,可以展平和取消展平 JSON

压平 一个简单的命令行实用程序,可以扁平化和取消扁平化 JSON。 如果您想将 JSON 转换为 CSV 或者您想将 JSON 插入到数据库表中,这是一个有用的第一步。 任何不能轻易展平的东西(散列和数组)都将被序列化为 JSON 字符串。

示波器实测RGMII信号:从125MHz时钟判断千兆模式,到时序抓取与PHY寄存器避坑

本文详细介绍了使用示波器实测RGMII信号的完整流程,包括125MHz时钟频率判断、时序参数测量及PHY寄存器配置避坑指南。通过实战操作和典型故障案例分析,帮助硬件工程师快速定位和解决千兆以太网接口的调试问题,提升通信稳定性。

weixin_30015371的博客 261

JSON——Json对象扁平化

一个层级结构很深的json对象如下: /* 0 */ { "_id" : ObjectId("576ca115c2de3628cc10edfe"), "IIid" : "67EE1C0C6281897283928D56407D4CE9", "IndexedDate" : ISODate("2016-06-24T02:54:41.152Z"), "Usage" : { "M

世界中心的专栏 8707

115.工业相机海康SDK开发指南(阅读)

包含初始化SDK和反初始化SDK接口。(由于看不到函数内部的具体实现,因此以下的解释仅代表个人的理解)

weixin_63779802的博客 5994

推荐项目:json-flattener——深挖JSON数据的扁平化宝藏

在当今这个数据驱动的时代,JSON作为一种轻量级的数据交换格式,其重要性不言而喻。然而,面对复杂嵌套的JSON结构,处理和查询数据往往成为开发中的痛点。为此,我们发现了一款极为实用的Java工具——`json-flattener`,它以其独特的功能,使开发者能够轻松地将嵌套的JSON对象转换为扁平化的形式,反之亦然,极大地简化了数据处理流程。 ## 项目介绍 `json-flattener`是

gitblog_00782的博客 652

第21章 分层架构软件测试

技术人员和客户代表对代码服务相关的技术进行详细的交流,由此确定代码审计的方案(哪些代码要审计、用什么方式审计、审计的时间、审计的要求等)代码审计报告提交和沟通之后,跟开发人员针对代码审查发现的问题进行修改,然后代码审查人员进行回归的检查,然后提交复查的报告;本层不需要了解其它层的实现细节,只需要考虑与本层相关的两层之间的接口和调用的情况。然后对客户要求的功能点进行人工的代码审查,对源代码的扫描结果进行人工的分析和确认;结合自动化扫描的结果和人工审查的结果生成测试对象的代码审查报告,最后提交给客户;

李黏黏的博客 3272

ST7789P3初始化配置

【代码】ST7789P3初始化配置。

zqq_1314的博客 4153

【亲测免费】 JSON Flattener 项目使用教程

JSON Flattener 项目的目录结构如下: ``` json-flattener/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── github/ │ │ │ └── wnameless/ │ │ │ └──

gitblog_00941的博客 558

最新版电子发票样式html+css--普通发票+增值发票

【代码】最新版电子发票样式html+css--普通发票+增值发票。

weixin_44110923的博客 3685

JSONPath核心语法与实战应用:从数据定位到高效查询

在数据处理领域,高效查询和提取结构化信息是核心需求。JSONPath作为一种声明式查询语言,其原理是通过路径表达式精准定位JSON文档中的节点,类似于文件系统路径导航。其技术价值在于提供了一种标准化、跨语言的方法来访问复杂嵌套数据,避免了繁琐的手动遍历和解析,极大提升了开发效率。在应用场景上,JSONPath广泛应用于API响应断言、数据清洗转换、日志分析监控等工程实践。本文聚焦于JSONPath的核心语法,如点号操作符、方括号索引、递归下降和强大的过滤器表达式,并结合JavaScript、Python、J

cqwmy840702的博客 386

Untiy之如何实现AI+MR (Pico4u 相机推流MR画面给Server做实时AI图像识别)

本文介绍了基于Pico4U企业版开发AI+MR应用的实现方案。文章详细说明了硬件准备步骤,包括购买企业版设备、申请相机权限和注册管理平台。重点讲解了Unity开发中获取摄像头画面的两种技术方案:通过Overlay直接渲染到Android Surface,或使用API获取图像数据转换为Texture。提供了完整的代码示例和权限配置说明,并揭示了底层通过JNI调用Android原生API的技术原理。该方案适用于带电操作等实习场景,可提升安全性和学习趣味性。

TxNet 1342

实时多目标跟踪(MOT):SORT与DeepSORT优化

实时多目标跟踪(MOT):SORT与DeepSORT优化​ ,人工智能,计算机视觉,大模型,AI,本文围绕实时多目标跟踪中的 SORT 与 DeepSORT 算法展开,阐述了两者原理、实现及优化。SORT 结合卡尔曼滤波和匈牙利算法,依赖目标检测,实时性好但复杂场景表现欠佳。DeepSORT 在其基础上引入外观特征,采用级联匹配,提升了跟踪精度和鲁棒性。还探讨了两种算法在检测、运动模型、外观特征等方面的优化方向,以及应用场景与选择建议,为相关应用和研究提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 20万+

【亲测免费】 强力推荐:Python中的JSON数据扁平化神器 —— flatten_json

在数据处理的浩瀚宇宙中,JSON作为一种灵活的数据交换格式,其层次结构为我们带来了极大的便利。然而,当面对复杂嵌套的JSON对象,将其转化为易于分析或数据库存储的扁平结构时,往往会感到头痛。今天,我们向您介绍一个Python领域的宝藏工具——`flatten_json`,它将引领您轻松跨越这一难关。 ## 项目介绍 `flatten_json`是一个简洁而高效的Python库,专为解决JSON

gitblog_00953的博客 910

【华为OD机试】创建二叉树(python, java, c++, js)

请按下列描达构建一颗二叉树,并返回该树的根节点: 1、先创建值为-1的根结点,根节点在第0层; 2、然后根据operations依次添加节点: operations[i] = [height, index] 表示对第 height 层的第index 个节点node, 添加值为i 的子节点: 若node 无「左子节点」。则添加左子节点; 若node 有「左子节点」但无「右子节点」,则添加右子节点: 否则不作任何处理。 height、index 均从0开始计数;index 指所在层的创建顺序。

A_D_I_D_A_S的博客 188

JSON数据平铺和对象化

JSON层级key平铺

s.lm的博客 1779

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Java 压平Json

【代码】Java 压平Json。

赵昕彧 679

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

.net Json 扁平化处理

利用JsonDocument 及递归 实现简易的Json扁平化处理。

qq_16679217的博客 512

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【亲测免费】 Python JSON 扁平化工具 —— flatten_json

`flatten_json` 是一个开源项目,旨在为 Python 开发者提供一个简单易用的库,用于将 JSON 对象扁平化。该项目的核心功能是能够将嵌套的 JSON 数据转换为一个扁平的键值对结构,便于进行数据分析处理。项目主要使用 Python 编程语言实现。 ## 2. 项目的核心功能 `flatten_json` 的核心功能包括: - **扁平化处理**:将嵌套的 JSON 对象转换

gitblog_00358的博客 588

java解析json字符串详解(两种方法)

一、使用JSONObject来解析JSON数据官方提供的,所以不需要导入第三方jar包;直接上代码,如下 private void parseJSONWithJSONObject(String JsonData) { try { JSONArray jsonArray = new JSONArray(jsonData); fo...

diaozongjian9397的博客 6949

快速扁平化,反扁平化任意嵌套层级JSON

//反扁平化 JSON.unflatten = function(data) { "use strict"; if (Object(data) !== data || Array.isArray(data)) return data; var regex = /\.?([^.\[\]]+)|\[(\d+)\]/g, resultholder = {}; for (var p in data) { var cur = result

CloudJay的博客 885

JSON数据生成扁平化字段名

用标准规则生成扁平化数据是无法直接作为数据库的列名定义的,如果想直接用于列名定义请查看,如果想用标准化的扁平化方案,请搜索JsonFlattener的使用 /** * JSON扁平化总入口 * * 会将所有的_去除 * 会将_后的第一个字母大写 * @param json * @return */ public static JSONArray unfold(String json) { if (jso

Run the ant 923

JSON解析拍平工具

json解析拍平工具

weixin_42868529的博客 964
上一篇: Kafka mirror调研学习与实验总结
下一篇: SpringBoot、thymeleaf和Bootstrap的填坑过程
梅雨心情
博客等级 码龄11年 39粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值