首页 > 编程语言 >复杂JSON数据的扁平化解析_Java实现

复杂JSON数据的扁平化解析_Java实现

时间:2024-01-22 16:24:41浏览次数:35  
标签:map jsonNode Java 扁平化 JsonNode JSON 解析 parentKey

在工作中遇到了解析JSON数据的场景,但是此岗位传统的做法是通过Python脚本来实现的,而且是非常不合理的手动解析——每对应不同的JSON数据结构,都需要手动改动很多脚本文件,工作量与JSON数据结构的复杂程度成正比!(很难想象这是一个做开发的人想出来的方案)

因此最开始接触此工作内容的时候,我就忍不住吐槽该实现的各种繁琐之处,遂萌生了使用Java语言实现自动化解析复杂JSON数据的想法。

需求:

将复杂JSON数据解构为扁平化数据,插入数据库对应的一张表上,供业务更直观地查询/阅览数据。

思路:

使用Jackson将数据转成JsonNode对象,然后通过递归解构至JsonNode不在为对象为止,然后put到一个LinkedHashMap中去,以此实现数据结构的扁平化变换。

核心代码:

public void print(JsonNode jsonNode) {
        Map<String, String> map = recursiveParse(jsonNode, new LinkedHashMap<>(), null);
        map.forEach((key, value) -> System.err.prinln(key + ":" + value));
    }

    private Map<String, String> recursiveParse(JsonNode jsonNode, Map<String, String> map, String parentKey) {
        if(jsonNode.isObject()){
            jsonNode.fields().forEachRemaining(entry -> {
                String currentKey = parentKey != null ? parentKey + "_" + entry.getKey() : entry.getKey();
                recursiveParse(jsonNode, map, currentKey);
            })
        }
        // 此前的经验:当JSON数据过于复杂时或Array的元素个数非常多时,Array结构若继续解析会导致一张表的字段数量过千
        // 为避免此情况,因此遇到Array结构不再解析,而是单独对此Array解析到另一张表
        else if(jsonNode.isArray()) {
            map.put(parentKey, jsonNode.toString());
        }
        else {
            map.put(parentKey, jsonNode.asText());
        }
    }

测试类验证:

    @Autowired
    private ObjectMapper objectMapper
    @Autowired
    private Xxxx xxxx;

    @Test
    public void testSth() {
        JsonNode jsonNode = objectMapper.readValue(Temp.class.getClassLoader().getResourceAsStream("xx.json"), JsonNode.class);
        xxxx.print(jsonNode);
    }

 经测试验证,和传统方式解析的效果一致,因此可以认为我的思路是对的,后续可以根据Map输出建表语句,然后由人工修改字段长度(这是无法避免的,除非你使用的数据库,字符串长度是可伸缩的)。

建好表以后,再拟定一个定时任务,读取JSON数据,解析,插入。(因为一些原因——守旧?,笔者的实现很可能无法应用于工作,因此后续的代码就没写了)

标签:map,jsonNode,Java,扁平化,JsonNode,JSON,解析,parentKey
From: https://www.cnblogs.com/ashet/p/17980282

相关文章

  • vscode windows CMakePresets.json
    vscode在windows下使用Ninja编译配置,使用VisualStudio编译环境。来源:CMakePresets.json参考:在VisualStudio中使用CMake预设进行配置和生成--示例文件CMakePresets.json{"version":2,"configurePresets":[{"name":"base","......
  • Python web crawler(2)json异步加载的格式
    异步加载的特点点击“查看更多”等按钮,浏览器“刷新”按钮无反馈效果。查看浏览器点击F12的“DevTools”开发者工具,点选“网络”——“Fetch/XHR”——每点击一次“加载更多”就会出现一次网络请求点击刷新出来的“请求内容”——点击“响应”,可以看到响应的是“字典”点击标......
  • Java基础复习之选择结构使用思路
    Java基础复习之选择结构使用思路目录目录Java基础复习之选择结构使用思路目录一、Java提供的三种选择结构二、三种选择结构的使用结构(一)关于if...else的三种使用结构(二)三元运算符(三)关于switch...case的两种使用结构三、选择结构使用思路一、Java提供的三种选择结构if、......
  • Java开发者的Golang进修指南:从0->1带你实现协程池
    在Java编程中,为了降低开销和优化程序的效率,我们常常使用线程池来管理线程的创建和销毁,并尽量复用已创建的对象。这样做不仅可以提高程序的运行效率,还能减少垃圾回收器对对象的回收次数。在Golang中,我们知道协程(goroutine)由于其体积小且效率高,在高并发场景中扮演着重要的角色。然......
  • 使用Javamail接收imaps协议的邮件
    网上的消息不能说大多,只能说基本都过时了,连imap和imaps都不分了本文基于apache-james项目搭建的邮件服务器,其他邮件服务器仅供参考首先是依赖,这里需要引入两个依赖,如下<dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId>......
  • 到底什么样的 Java 项目用 Solon 好???
    什么样的Java项目用Solon好就像华为讲的,不要因为爱国而特意买华为手机。Solon也是,有需要就用不需要就跳过(按正常的需求选择):信创需要国产化,应该用Solon或者SolonCloud(有案例)军工项目要国产化,应该用Solon或者SolonCloud(有案例)嵌入式设备,内存有限,算力差,可以用Solo......
  • JavaScript 中的展开运算符是什么?
    展开运算符(SpreadOperator)是JavaScript中的一种语法,用于将可迭代对象(如数组或字符串)展开为独立的元素。它使用三个连续的点号(...)作为操作符。展开运算符可以在多种情况下使用,包括数组、对象和函数调用等。下面是一些展开运算符的用法示例:1:展开数组:使用展开运算符可以将一......
  • Java 如何将Excel转换为TXT文本格式
    TXT文件是一种非常简单、通用且易于处理的文本格式。在处理大规模数据时,将Excel转为TXT纯文本文件可以提高处理效率。此外,许多编程语言和数据处理工具都有内置的函数和库来读取和处理TXT文件,因此将Excel文件转换为TXT还可以简化数据导入过程。本文将介绍如何使用Java将Excel转为TX......
  • 根据返回的多层Json来进行创建文件,达到根据阶层创建,然后压缩成压缩包进行下载
    临时接到一个需求说让根据按照下面的这个图片的结构来打包下载指定位置下的文件到指定位置!实现思路:1.把已经实现的树形结构的代码进行调用,拿到他的数据进行创建对应的文件夹2.因为结构下方的文件没有特别直观的数据库中的关联关系,所以还需要对于管理关系进行梳理3.创......
  • [转]一篇搞懂javascript正则表达式
    原文地址:一篇搞懂javascript正则表达式-知乎最近在看vue源码的时候发现一个令人头疼的问题,就是正则表达式,在此之前我对正则只有一知半解,没有深入了解,所以看到正则高级写法都不知是什么含义,哎...,所以就去查看相关资料和博主写的,特意整理记录一下学习的过程并用通俗易懂的文章分......