【御控物联】JavaScript JSON结构转换(18):数组To对象——多层属性重组

文章目录

  • 一、JSON结构转换是什么?
  • 二、案例之《JSON数组 To JSON对象》
  • 三、代码实现
  • 四、在线转换工具
  • 五、技术资料


一、JSON结构转换是什么?

JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换,生成新的JSON对象或数组的过程。这种转换可以包括改变JSON数据的结构、提取特定字段、合并多个JSON数据,或者对数据进行计算和处理等操作。

在JSON结构转换中,常见的操作包括:

  • 提取字段:从一个JSON对象中提取特定字段,生成新的JSON对象。
  • 过滤数据:根据条件过滤JSON数据,生成符合条件的新JSON对象或数组。
  • 映射转换:将一个JSON对象中的字段映射到另一个字段,生成新的JSON对象。
  • 合并数据:将多个JSON对象或数组合并成一个新的JSON对象或数组。

JSON结构转换通常在数据处理、数据清洗、数据分析等场景中广泛应用。通过结构转换,可以根据需求定制化地处理JSON数据,使其符合特定的业务逻辑或数据格式要求。
为此我们提供了一个简单开源的JS类库,接下来我们对此类库进行详细讲解。

二、案例之《JSON数组 To JSON对象》

源JSON结构:

{"b1": [[{"k1_child": "v1_child"}],[{"k2_child": "v2_child"}],[{"k3_child": "v3_child"}]]
}

目标JSON结构:

{"a": {"k": {"kk": "v"},"m": {"mm": "w"},"n": {"nn": "x"}}
}

转换需求:

以下需求分别执行

场景一:

  1. 将源结构的“b1”值替换到目标结构的“a.k”中
  2. 将源结构的“b1”值追加到目标结构的“a.m”中
  3. 将源结构的“b1”值替换到目标结构的“a.n”中

场景二:

  1. 将源结构的“b1[0]”值替换到目标结构的“a.k”中
  2. 将源结构的“b1[0]”值追加到目标结构的“a.m”中
  3. 将源结构的“b1[0]”值替换到目标结构的“a.n”中

场景三:

  1. 将源结构的“b1[0]”值追加到目标结构的“a.k”中
  2. 将源结构的“b1[1]”值追加到目标结构的“a.m”中
  3. 将源结构的“b1[2]”值追加到目标结构的“a.n”中

三、代码实现

场景一:

  1. 将源结构的“b1”值替换到目标结构的“a.k”中
  2. 将源结构的“b1”值追加到目标结构的“a.m”中
  3. 将源结构的“b1”值替换到目标结构的“a.n”中

import JsonTranferUtil from './json_transfer'/************************数组转对象   示例数据 ********************** *//// 转换类型
/// 1:源Key->目标Key
/// 2:源Key->目标Value
/// 3:源Value->目标Key
/// 4:源Value->目标Value
const mappings = [{"OrgJsonPath": "root.b1","AimJsonPath": "root.a.k","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "2","TranOP": "1","TranWay": "1"}},{"OrgJsonPath": "root.b1","AimJsonPath": "root.a.m","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "1","TranOP": "1","TranWay": "1"}},{"OrgJsonPath": "root.b1","AimJsonPath": "root.a.n","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "2","TranOP": "1","TranWay": "1"}}
];
const jsonOrg = {"b1": [[{"k1_child": "v1_child"}],[{"k2_child": "v2_child"}],[{"k3_child": "v3_child"}]]};
const jsonAim ={"a": {"k": {"kk": "v"},"m": {"mm": "w"},"n": {"nn": "x"}}};/*******************数组转对象    测试程序***************** */let jsonTranferUtil = new JsonTranferUtil(jsonOrg, jsonAim, mappings);
let result = jsonTranferUtil.tranJson();
console.log("*************************最终转换结果*********************************")
console.log(JSON.stringify(result), 9999999999999)

执行结果如下:
在这里插入图片描述

场景二:

  1. 将源结构的“b1[0]”值替换到目标结构的“a.k”中
  2. 将源结构的“b1[0]”值追加到目标结构的“a.m”中
  3. 将源结构的“b1[0]”值替换到目标结构的“a.n”中
import JsonTranferUtil from './json_transfer'/************************数组转对象   示例数据 ********************** *//// 转换类型
/// 1:源Key->目标Key
/// 2:源Key->目标Value
/// 3:源Value->目标Key
/// 4:源Value->目标Value
const mappings = [{"OrgJsonPath": "root.b1[0]","AimJsonPath": "root.a.k","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "2","TranOP": "1","TranWay": "1"}},{"OrgJsonPath": "root.b1[0]","AimJsonPath": "root.a.m","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "1","TranOP": "1","TranWay": "1"}},{"OrgJsonPath": "root.b1[0]","AimJsonPath": "root.a.n","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "2","TranOP": "1","TranWay": "1"}}
];
const jsonOrg = {"b1": [[{"k1_child": "v1_child"}],[{"k2_child": "v2_child"}],[{"k3_child": "v3_child"}]]};
const jsonAim ={"a": {"k": {"kk": "v"},"m": {"mm": "w"},"n": {"nn": "x"}}};/*******************数组转对象    测试程序***************** */let jsonTranferUtil = new JsonTranferUtil(jsonOrg, jsonAim, mappings);
let result = jsonTranferUtil.tranJson();
console.log("*************************最终转换结果*********************************")
console.log(JSON.stringify(result), 9999999999999)/*******************数组转对象    测试程序***************** */let jsonTranferUtil = new JsonTranferUtil(jsonOrg, jsonAim, mappings);
let result = jsonTranferUtil.tranJson();
console.log("*************************最终转换结果*********************************")
console.log(JSON.stringify(result), 9999999999999)

执行结果如下:

在这里插入图片描述

场景三:

  1. 将源结构的“b1[0]”值追加到目标结构的“a.k”中
  2. 将源结构的“b1[1]”值追加到目标结构的“a.m”中
  3. 将源结构的“b1[2]”值追加到目标结构的“a.n”中

import JsonTranferUtil from './json_transfer'/************************数组转对象   示例数据 ********************** *//// 转换类型
/// 1:源Key->目标Key
/// 2:源Key->目标Value
/// 3:源Value->目标Key
/// 4:源Value->目标Value
const mappings = [{"OrgJsonPath": "root.b1[0]","AimJsonPath": "root.a.k","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "1","TranOP": "1","TranWay": "1"}},{"OrgJsonPath": "root.b1[1]","AimJsonPath": "root.a.m","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "1","TranOP": "1","TranWay": "1"}},{"OrgJsonPath": "root.b1[2]","AimJsonPath": "root.a.n","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "1","TranOP": "1","TranWay": "1"}}
];
const jsonOrg = {"b1": [[{"k1_child": "v1_child"}],[{"k2_child": "v2_child"}],[{"k3_child": "v3_child"}]]};
const jsonAim ={"a": {"k": {"kk": "v"},"m": {"mm": "w"},"n": {"nn": "x"}}};/*******************数组转对象    测试程序***************** */let jsonTranferUtil = new JsonTranferUtil(jsonOrg, jsonAim, mappings);
let result = jsonTranferUtil.tranJson();
console.log("*************************最终转换结果*********************************")
console.log(JSON.stringify(result), 9999999999999)

执行结果如下:

在这里插入图片描述

四、在线转换工具

为了让使用者更加方便的配置出映射关系,为此开发了一套在线转换工具,可在工具中通过拖拽即可配置想要的结构转换关系,并可对转换关系所能实现的效果实时进行预览更改。

工具地址:数据转换工具
在这里插入图片描述

五、技术资料

  • Github:edq-ebara/data-transformation-javascript: 数据转化(javascript) (github.com)
  • 技术探讨QQ群:775932762
  • 工具连接:数据转换工具
  • 御控官网:https://www.yu-con.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang 开发实战day07 - Functions

🏆个人专栏 🤺 leetcode 🧗 Leetcode Prime 🏇 Golang20天教程 🚴‍♂️ Java问题收集园地 🌴 成长感悟 欢迎大家观看,不执着于追求顶峰,只享受探索过程 Golang 教程07 - Functions …

磁盘挂载、配额、逻辑盘配置

文章目录 一、磁盘挂载1、磁盘分区2、文件系统3、挂载 二、磁盘配额三、逻辑盘配置拓展逻辑卷缩小逻辑卷2、权限3、查找4、软件包、压缩5、常见符号6、克隆虚拟机 I know, i know 地球另一端有你陪我 一、磁盘挂载 分区-格式化&文件系统-磁盘挂载 1、磁盘分区 最多…

HTML+CSS+JS复习回顾

环境搭建 下载VScode,依次下载插件:HTML CSS support、Live Server、Auto Rename Tag 一、HTML篇 HTML通过一系列的标签(元素)来定义文本、图像、链接等。HTML标签是由尖括号包围的关键字。标签通常成对出现,包括开…

基于SSM的校园二手物品交易平台论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本校园二手物品交易平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…

spring-cloud微服务负载均衡器ribbon

注意:2020年前SpringCloud是采用Ribbon作为负载均衡实现,但是在2020后采用了LoadBalancer替代,所以要查看springboot,springcloud,sprincloudalibaba的版本链接对应,Ribbon负载均衡都是在springboot版本2.4…

【LeetCode热题100】【二叉树】二叉树的层序遍历

题目链接&#xff1a;102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 借助队列实现广度优先搜索&#xff0c;遍历节点把子树入队 class Solution { public:vector<vector<int>> levelOrder(TreeNode *root) {if (root nullptr)return {};vector…

外观模式(面子模式)

外观模式 文章目录 外观模式什么是外观模式示例 什么是外观模式 外观模式(Facade),为子系统中的一组接口提供一个一致的界面&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用 Facade 外观类 知道哪些子系统类负责处理请求&#xff0c;将客…

接收RTSP流-断掉重连如何继续显示

问题&#xff1a;写了一个Py脚本接收RTSP视频流并显示&#xff0c;但是RTSP视频流断掉重新恢复时&#xff0c;Py脚本却卡住了&#xff0c;无法继续显示视频。 解决&#xff1a;当RTSP断掉时&#xff0c;释放cap&#xff0c; 如果cap.read()这一步读取时间超过5秒&#xff0c;也…

面试题:volatile

一旦一个共享变量&#xff08;类的成员变量、类的静态成员变量&#xff09;被volatile修饰之后&#xff0c;那么就具备了两层语义&#xff1a; 1. 保证线程间的可见性 保证了不同线程对这个变量进行操作时的可见性&#xff0c;即一个线程修改了某个变量的值&#xff0c;这新值…

探索数据保护的新边界:去标识化加密技术

随着数字化时代的到来&#xff0c;个人信息的保护成为了一个不可忽视的话题。企业和组织在处理大量用户数据的同时&#xff0c;也面临着如何保护用户隐私的挑战。在这样的背景下&#xff0c;去标识化加密技术应运而生&#xff0c;成为了数据安全领域的一大利器。 ### 什么是去…

【攻防世界】wife_wife

原型链污染 源码 app.post(/register, (req, res) > {let user JSON.parse(req.body)if (!user.username || !user.password) {return res.json({ msg: empty username or password, err: true })}if (users.filter(u > u.username user.username).length) {return …

vue3.0 列表页面做缓存

一.设置动态keepalive <router-view v-slot"{ Component, route }"><keep-alive :include"cacheViewsState"><component :is"Component" /></keep-alive></router-view> 可以将要缓存的页面作为vuex全局变量储存…

推进数智化财务管理体系,助力企业降本提效

在数字经济快速发展的今天&#xff0c;数字化能力早已成为企业发展的核心竞争力。在开放、融合的数字经济大背景下&#xff0c;企业该如何将科技深度赋能业务&#xff0c;打造出高质量发展的新引擎&#xff1f;当财务管理缺乏精准化、精确化、及时性的问题逐渐显露&#xff0c;…

【Python】不会优雅的记日志,你又又Out了!!!

1. 引言 在日常开发中&#xff0c;大家经常使用 print 函数来调试我们写的的代码。然而&#xff0c;随着打印语句数量的增加&#xff0c;由于缺乏行号或函数名称&#xff0c;很难确定输出来自何处。而且随着print语句的增多&#xff0c;调试完代码删除这些信息的时候也比较麻烦…

实现首选目标|国内博士后赴新加坡继续从事博士后研究

申请时&#xff0c;V博士尚为国内在站的博士后&#xff0c;其希望在我们的帮助下&#xff0c;加入国外导师先进的课题组&#xff0c;在拓展学术视野的同时&#xff0c;延续自己的科研项目并结题&#xff0c;目标国家首选新加坡。最终我们用新加坡科技研究局&#xff08;A*STA&a…

爬虫之数据神器10---Peewee实现ORM的核心原理

前言: 继续上一篇:爬虫之数据神器9---Peewee集成Django/Flask框架详解-CSDN博客 本章主要讲一些原理方面的东西,帮助大家在项目中 可以更好的理解! 正文: 一、模型定义 在Peewee中&#xff0c;模型的定义是通过模型元类&#xff08;ModelMetaclass&#xff09;实现的。Peew…

TiDB 实战分享丨第三方支付企业的核心数据库升级之路

本文介绍了一家第三方支付企业在面对市场竞争和监管压力的态势下&#xff0c;通过升级核心数据库来提升业务能力的实践。该企业选择 TiDB 分布式数据库&#xff0c;成功将其应用于核心业务、计费、清结算和交易查询等关键系统。TiDB 的水平扩展能力、高可用性和简化数据栈等优势…

electron打包Vue前端

Electron-Forge 打包Vue项目 效果&#xff1a;electronforge可将前端静态页面打包成.exe、.deb和.rpm等&#xff0c;能适配各种平台 示例&#xff1a;Windows环境下将前端 Vue 项目打包成exe文件 打包后的 exe 文件 运行 exe 文件 一、项目准备 开源项目 RouYi 下载 本…

码蹄集部分题目(第五弹;OJ赛2024年第10期)

&#x1f40b;&#x1f40b;&#x1f40b;竹鼠通讯&#xff08;钻石&#xff1b;分治思想&#xff1b;模板题&#xff1a;就算几何平面点对问题&#xff09; 时间限制&#xff1a;3秒 占用内存&#xff1a;128M &#x1f41f;题目描述 在真空中&#xff0c;一块无限平坦光滑…

Python程序设计 闭包

1. 闭包 1.1 作用域 内置名称&#xff08;built-in names&#xff09;&#xff0c; Python 语言内置的名称&#xff0c;比如函数名 abs、char 和异常名称 BaseException、Exception 等等。全局名称&#xff08;global names&#xff09;&#xff0c;模块中定义的名称&#xf…