利用递归实现JSON扁平化

logstash之嵌套复杂json解析及扁平化处理 近期公司有一个需求是使用logstash将复杂的嵌套json扁平化(将原来的多层json映射成单层json,其中的key通过下划线'_'连接),并写入s3。据我以往的经验我推测应该有两种方案可行,其中方案一代码简单,但缺点很多,方案二简单高效,但网上没有现成的,我以往也没有使用过,通过google也只google到event.to_hash这个稍微有用的方法,这也是我分享的原因,望对有类似需求的朋... 阅读详情

1.引入JSON依赖包

把字符串解释成JSON再进行扁平化处理
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>

2.代码实现

package com.ztesoft;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class JsonParse {

	public static void main(String[] args) {
		String jsonStr = "{\"type\":10,\"data\":[{\"text\":\"献给爱我们的女神\",\"is_liked\":false,\"index_cover\":\"http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_989_123986672_17737936936133063098.jpg?imageView/2/w/960/q/85\",\"poi\":\"\",\"cover_image_height\":816,\"trip_id\":2387282916,\"index_title\":\"\",\"center_point\":{\"age\":19,\"name\":\"小明\"},\"view_count\":36207,\"location_alias\":\"\",\"cover_image_1600\":\"http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/2/w/1384/h/1384/q/85\",\"cover_image_s\":\"http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/1/w/280/h/280/q/75\",\"share_url\":\"btrip/spot/2387842143/\",\"timezone\":\"Asia/Shanghai\",\"date_tour\":\"2016-06-19T01:19:07+08:00\",\"is_hiding_location\":false,\"user\":{\"location_name\":\"\",\"name\":\"丑到没墙角\",\"resident_city_id\":\"\",\"mobile\":\"\",\"gender\":2,\"avatar_m\":\"http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.m\",\"cover\":\"http://photos.breadtrip.com/default_user_cover_10.jpg-usercover.display\",\"custom_url\":\"\",\"experience\":{\"value\":59,\"level_info\":{\"name\":\"\",\"value\":1}},\"id\":2384288641,\"birthday\":\"\",\"country_num\":null,\"avatar_s\":\"http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.s\",\"country_code\":null,\"email_verified\":false,\"is_hunter\":false,\"cdc2\":false,\"avatar_l\":\"http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.l\",\"email\":\"\",\"user_desc\":\"\",\"points\":2},\"spot_id\":2387842143,\"is_author\":false,\"cover_image_w640\":\"http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/1/w/640/h/480/q/85\",\"region\":{\"primary\":\"\",\"secondary\":\"\"},\"comments_count\":2,\"cover_image\":\"http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/2/w/960/q/85\",\"cover_image_width\":1088,\"recommendations_count\":21}],\"desc\":\"\"}";

		Map<String, Object> flatMap = jsonFlattenAsMap(jsonStr);

		for (Map.Entry<String, Object> entry : flatMap.entrySet()) {
			System.out.println(entry.getKey() + " : " + entry.getValue());
		}
	}

	/**
	 * JSON扁平化函数
	 * 
	 * @param jsonStr
	 *            可解释jsonStr字符串
	 * @return 扁平化函数Map
	 */
	public static Map<String, Object> jsonFlattenAsMap(String jsonStr) {

		Object jsonObj = JSON.parse(jsonStr);

		// 有序HashMap
		Map<String, Object> flatMap = new LinkedHashMap<String, Object>(200);

		reduce(flatMap, "", jsonObj);

		return flatMap;
	}

	/**
	 * 递归调用
	 * 
	 * @param flatMap
	 *            结果集
	 * @param key
	 *            当前键
	 * @param jsonObj
	 *            递归对象
	 */
	private static void reduce(Map<String, Object> flatMap, String key, Object jsonObj) {

		// 如果是对象,对JSON对象进行解释
		if (jsonObj instanceof JSONObject) {
			JSONObject parseJsonObj = (JSONObject) jsonObj;

			if (parseJsonObj.isEmpty()) {
				// 如果是空对象,返回空对象
				flatMap.put(key, "{}");

			} else {

				for (Entry<String, Object> entry : parseJsonObj.entrySet()) {
					String entryKey = entry.getKey();
					Object entryValue = entry.getValue();

					String concatKey = !"".equals(key) ? key.concat(".").concat(entryKey) : entryKey;

					if (entryValue instanceof JSONObject) {
						reduce(flatMap, concatKey, entryValue);
					} else if (entryValue instanceof JSONArray) {
						reduce(flatMap, concatKey, entryValue);
					} else {
						// 放置所有连接值
						flatMap.put(concatKey, entryValue);
					}
				}
			}

		} else if (jsonObj instanceof JSONArray) {

			// 如果是数组JSONArray
			JSONArray parseJsonObj = (JSONArray) jsonObj;

			if (parseJsonObj.isEmpty()) {
				// 如果是数组,返回空集
				flatMap.put(key, "[]");

			} else {

				for (int i = 0; i < parseJsonObj.size(); i++) {
					key = key + "[" + i + "]";
					reduce(flatMap, key, parseJsonObj.get(i));
				}
			}

		}

	}

}

3.输出结果

data[0].cover_image_1600 : http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/2/w/1384/h/1384/q/85
data[0].timezone : Asia/Shanghai
data[0].cover_image_height : 816
data[0].poi : 
data[0].location_alias : 
data[0].cover_image_s : http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/1/w/280/h/280/q/75
data[0].is_hiding_location : false
data[0].is_author : false
data[0].index_cover : http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_989_123986672_17737936936133063098.jpg?imageView/2/w/960/q/85
data[0].text : 献给爱我们的女神
data[0].cover_image : http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/2/w/960/q/85
data[0].is_liked : false
data[0].index_title : 
data[0].trip_id : 2387282916
data[0].date_tour : 2016-06-19T01:19:07+08:00
data[0].spot_id : 2387842143
data[0].recommendations_count : 21
data[0].center_point.name : 小明
data[0].center_point.age : 19
data[0].cover_image_w640 : http://photos.breadtrip.com/photo_d_2016_06_19_01_21_20_926_123986672_17737936923172662193.jpg?imageView/1/w/640/h/480/q/85
data[0].share_url : btrip/spot/2387842143/
data[0].comments_count : 2
data[0].cover_image_width : 1088
data[0].region.secondary : 
data[0].region.primary : 
data[0].user.avatar_m : http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.m
data[0].user.birthday : 
data[0].user.avatar_l : http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.l
data[0].user.email_verified : false
data[0].user.gender : 2
data[0].user.mobile : 
data[0].user.avatar_s : http://photos.breadtrip.com/avatar_41_b8_aedfd71640e3ec09d0c30edc47df04dc56dbf38a.jpg-avatar.s
data[0].user.experience.level_info.name : 
data[0].user.experience.level_info.value : 1
data[0].user.experience.value : 59
data[0].user.points : 2
data[0].user.cover : http://photos.breadtrip.com/default_user_cover_10.jpg-usercover.display
data[0].user.is_hunter : false
data[0].user.user_desc : 
data[0].user.country_code : null
data[0].user.location_name : 
data[0].user.resident_city_id : 
data[0].user.name : 丑到没墙角
data[0].user.id : 2384288641
data[0].user.cdc2 : false
data[0].user.email : 
data[0].user.custom_url : 
data[0].user.country_num : null
data[0].view_count : 36207
type : 10
desc : 
 

专治疑难系列 - 解决打印机凭证冲突问题 一、问题描述 二、解决方法 三、问题已解决 阅读详情

相关推荐

vue中使用video-player视频插件,第一次无法监听父组件穿过来的值解决办法

需求: 页面![在这里插入图片描述](https://img-blog.csdnimg.cn/20201208141906802.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FfOTg4OA==,size_16,color_FFFFFF,t_70) 作品清单是从后端请求回来的不同格式的url,前端需求根据后缀动态判断格式,然后对齐进行下载和

A_9888的博客 770

.net Json 扁平化处理

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

qq_16679217的博客 512

基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统

增加了模型的绑定,利用Mediapipe这个强大的库可以实现识别面部表情的捕捉和人体结构运动的捕捉,基于以上的特性加入到Unity的人物模型中,实现实时的面部表情和人体运行的捕捉

BIgbossyii的博客 1万+

JSON——Json对象扁平化

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

世界中心的专栏 8707

瑞萨 RL78 开发环境实战:从 CS+ for CC 到 e² studio 高效开发

本文详细介绍了瑞萨RL78单片机开发环境的选择与配置,对比分析了CS+ for CC和e² studio的特点及适用场景。内容涵盖环境安装、工程创建、调试技巧、外设驱动开发和低功耗设计等实战经验,为开发者提供全面的RL78入门指南,帮助快速上手并高效开发。

4k5l6j7h8的博客 242

UniApp消息推送进阶:不用插件实现动态语音播报(含保活策略)

本文详细介绍了在UniApp中实现动态语音播报的进阶方案,无需依赖第三方插件。核心采用透传消息传递动态数据,结合本地TTS引擎合成语音,并针对不同安卓厂商提供了深度通道配置与差异化保活策略,有效解决了App退至后台或被清理后语音播报失效的难题。

weixin_29224309的博客 490

Web前端之JavaScript实现树形JSON结构数据扁平化、多种方式实现纯数组降维、递归、parseInt、isArray、reduce、concat、Number、some、join

Web前端之JavaScript实现树形JSON结构数据扁平化、多种方式实现纯数组降维、递归、parseInt、isArray、reduce、concat、Number、some、join

优快云博客主页地址:https://mengjian.blog.youkuaiyun.com/ 1719

基于ST32 DAC7311数模转换器驱动代码及电路设计完整版

基于ST32的DAC7311模数转换器的电路设计及驱动代码完整版

qq_39626643的博客 3720

Java:JSON扁平化和去扁平化

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

拾荒追逐者的博客 6831

VMware虚拟机调用NVIDIA显卡全攻略:从3D加速到直通与vGPU

显卡虚拟化技术是虚拟化领域的关键组成部分,它通过在虚拟机中模拟或直接分配物理GPU资源,实现了图形渲染与通用计算的加速。其核心原理在于通过Hypervisor层对GPU指令进行拦截、转换或直接映射,从而平衡资源隔离与性能损耗。这项技术的核心价值在于提升资源利用率、实现计算环境隔离,并支持AI训练、3D渲染、科学计算等高性能负载的灵活部署。在应用场景上,轻量级图形界面加速、CUDA学习验证适合使用虚拟3D加速;而追求极致性能的机器学习训练、专业渲染则需依赖PCIe直通技术;对于企业级GPU资源池化与多租户共享

weixin_32308101的博客 1036

大模型量化技术全解析:从INT8到GPTQ/AWQ,降低部署成本实战指南

模型量化是一种通过降低神经网络权重和激活值的数据精度(如从FP16降至INT8/INT4),从而大幅减少模型内存占用和计算开销的核心模型压缩技术。其原理基于线性变换,将高精度浮点数映射到低精度整数表示,在硬件层面能利用专用低精度计算单元实现显著加速。这项技术的核心价值在于解决了大模型(如千亿参数LLM)部署时面临的高昂显存成本和推理延迟问题,使其能在消费级GPU和边缘设备上高效运行。当前,后训练量化(PTQ)因其无需重新训练的特性成为主流,衍生出GPTQ、AWQ、SmoothQuant等多种方法,广泛应用于

weixin_33804582的博客 631

python 实现JSON对象的扁平化

也就是遇到字典使用字符 ' . '进入结构,遇到元组或列表使用[index]进入;借助python自身yield特性和字典表达式提供了最精简的实现。

weixin_34103737的博客 517

一文读懂 STAR-CCM+:多物理场仿真王者,从入门到精通全攻略(附实战路线)

STAR-CCM+是西门子旗下的多物理场仿真平台,集流体、传热、结构、电磁等耦合求解于一体。其核心优势包括:全自动网格处理技术(支持十亿级网格)、多物理场无缝耦合、CPU/GPU并行加速计算、流程自动化与设计探索等。广泛应用于汽车(空气动力学优化、电池热管理)、航空航天(气动设计、发动机仿真)、能源(风电叶片流固耦合)、电子(芯片散热)等行业。相比ANSYS Fluent和OpenFOAM,STAR-CCM+在多物理场耦合和复杂几何处理方面更具优势,适合工业级高精度仿真需求。学习路径建议从基础操作入手,逐步

源代码杀手的博客 342

javascript数组扁平化三种写法

数组扁平化是指将一个多重嵌套的数组变为一维数组: let arr = [1,[[2,2],1],3,[4,5,[6,7]]]; // =&gt;[ 1, 2, 2, 1, 3, 4, 5, 6, 7 ] 如何实现呢?这里有三个思路: 1. 利用reduce函数: return this.reduce((total, val) =&gt; Array.isArr...

m0_38005587的博客 314

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

数组扁平化

对数组扁平化方法的收集

无敌的大前端 99

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

一个系列带你搞定前端面试的手写代码环节(6) --- 数组扁平化

这期的内容是数组扁平化,这也是很考察基本功的一道题,解决的办法也比较多。 什么是数组扁平化 常规的解释就是把一个多维数组转成一维数组,比如形如[1, [2, [3, [4, [5]]]]]的数组转为[1,2,3,4,5]。 // 来个示例数组 let arr = [1, [2, [3, [4, [5]]]]]; flat()方法 + Infinity JS是有提供原生处理数组扁平化的方法的,就是flat()方法,但是flat()默认是拉平一层的嵌套数组,传入数字几就拉平几层。但是在很多情况下,我们并.

CreatorRay的博客 308

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数组扁平化的四种方法

文章目录数组扁平化数组扁平化的四种方法数组自带的flat方法利用正则函数递归使用reduce 数组扁平化 数组扁平化是指将一个多维数组变为一个一维数组 const arr=[1,[2,[3,4]]]=>[1,2,3,4] 数组扁平化的四种方法 数组自带的flat方法 const arr=[1,[2,[3,4]]]; console.log(arr.flat(Infinity));// [1, 2, 3, 4] 利用正则 先使用JSON.stringify(arr)将

Amethyst的博客 701

JS - 将tree(树形)数据结构格式改为一维数组对象格式(扁平化)

需求:将JSON①数据格式输出为JSON②格式。 JSON①: [ { sortName:'小明', sortCode: 'xm', children:[] }, { sortName:'小刚', sortCode:'xg', children:[ { sortName:'小小刚', sortCode:'xxg' }, { sortName:'小小小刚', sortCode:'xxxg' } ] } ], JSO

huangfuyk.的博客 2041

数组扁平化 JS代码实现

JS手撕代码

yavlgloss的博客 569

实现数组扁平化

let arr = [1,[2,3],[1,[1,2],88]] let d = []; let flntten = arr => { for (let i = 0; i < arr.length; i++) { if (Array.isArray(arr[i])) { fn(arr[i]); } else { d.push(arr[i]); } } } flntten(.

qianbaozi的博客 95

JavaScript数组扁平化的实现

JavaScript数组扁平化的实现,持续更新中……

前端御书房 229

js 数组扁平化(多维转一维)

let arr = [1, 2, [3, 4, [5, 6]], 7]; //方法一: console.log(arr.join(',').split(',')); //方法二: console.log(JSON.stringify(arr).replace(/[\[\]]/g,'')); //方法三: let arr1 = []; function fn(arr) { arr.forEach((item, index, arr) => { if (Array.isArray(

weixin_42291794的博客 178

用 JSON 表现树的结构兼谈队列、堆栈的练习(二)

查找,又叫作搜索 search。查找跟遍历的概念不同,遍历是全部的节点都要走一遍,而查找,找到目标节点就立刻返回,不会继续遍历了。当然,如果什么都没查找到,就是一次完整的遍历过程了。

zhangxin09的专栏 1968

数组扁平化,深浅拷贝

用递归函数解决浅拷贝,name都会跟着变。

lxt135744的博客 213

告别嵌套地狱:ES6数组扁平化与去重的5种实战方案

你是否还在为多层嵌套数组的处理而头疼?是否还在用冗长的循环嵌套来实现数组去重?本文将带你利用ECMAScript 6(ES6)的新特性,用最少的代码解决数组扁平化与去重这两个常见痛点。读完本文,你将掌握5种高效简洁的实现方案,并了解它们的适用场景和性能差异。 ## 为什么需要数组扁平化与去重? 在实际开发中,我们经常会遇到需要处理多层嵌套数组或去除重复元素的场景,例如: - 处理后端返回的复杂...

gitblog_01103的博客 1022

30分钟用flatMap搭建JSON转换器

最近需要处理大量嵌套结构的JSON数据,手动转换效率太低。研究后发现用flatMap配合Vue3能快速实现一个可视化转换工具,这里分享具体实现思路和踩坑经验。特别适合这类原型开发,浏览器里就能完成全部编码->测试->部署流程。他们的在线编辑器响应很快,最惊喜的是能直接生成可分享的演示链接,不用自己折腾服务器。整个过程比我预想的顺利,从零开始到基本功能可用确实控制在30分钟左右。后续打算增加数据校验和批量处理功能,这个工具应该能帮团队节省不少数据处理时间。- 可视化字段映射配置(允许用户自定义输出字段名)

EmeraldEagle36的博客 561
上一篇: hive默认分区数据问题
下一篇: spark-sql(jdbc)本地模式导出csv或Excel文件
SimpleSimpleSimples
博客等级 码龄10年 6451粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值