【御控物联】 JavaScript JSON结构转换(4):对象To对象——规则属性重组

文章目录

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


一、JSON结构转换是什么?

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

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

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

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

二、术语解释

1. 规则属性
规则属性常用于批量属性匹配转换
规则属性包含两种

  • 对象的“ * ”,如a.*、a.*.name、a.*.*、a.*.*.age
  • 数组的“ [*] ”,a[*]、a[*].name

三、案例之《JSON对象 To JSON对象》

源JSON结构:

{"a": {"b": "1","c": {"c_child": "2"},"d": {"d_child": "3"}}
}

目标JSON结构:

{"b1": {"k1": "v1","k2": {"k2_child": "v2_child"},"k3": {"k3_child": "v3_child"}}
}

转换需求:

以下需求分别执行

  1. 将源结构的“a.*”值追加到目标结构的“b1”值
  2. 将源结构的“a.*”值替换到目标结构的“b1”值
  3. 将源结构的“a.*”值追加到目标结构的“b1”值,使用高级配置中的转换操作【复制源子元素(新Key)】
  4. 将源结构的“a.*”键追加到目标结构的“b1”值,高级配置中的转换操作【复制源子元素(原Key)】失效,默认为【复制源子元素(新Key)】
  5. 将源结构的“a.*.*”键替换到目标结构的“b1”值

四、代码实现

1.将源结构的“a.*”值追加到目标结构的“b1”值

import JsonTranferUtil from './json_transfer_new'
const jsonOrg = {"a": {"b": "1","c": {"c_child": "2"},"d": {"d_child": "3"}}
};
const jsonAim = {"b1": {"k1": "v1","k2": {"k2_child": "v2_child"},"k3": {"k3_child": "v3_child"}}
};
/// 转换类型
/// 1:源Key->目标Key
/// 2:源Key->目标Value
/// 3:源Value->目标Key
/// 4:源Value->目标Value
const mappings = [{"AimJsonPath": "root.b1","OrgJsonPath": "root.a.*","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "1","TranOP": "1","TranWay": "1"}}
];
/******************* 测试程序***************** */
let jsonTranferUtil = new JsonTranferUtil(jsonOrg, jsonAim, mappings);
let result = jsonTranferUtil.tranJson();
console.log("*************************最终转换结果*********************************")
console.log(JSON.stringify(result), 88888888888)

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

2.将源结构的“a.*”值替换到目标结构的“b1”值

import JsonTranferUtil from './json_transfer_new'
const jsonOrg = {"a": {"b": "1","c": {"c_child": "2"},"d": {"d_child": "3"}}
};
const jsonAim = {"b1": {"k1": "v1","k2": {"k2_child": "v2_child"},"k3": {"k3_child": "v3_child"}}
};
/// 转换类型
/// 1:源Key->目标Key
/// 2:源Key->目标Value
/// 3:源Value->目标Key
/// 4:源Value->目标Value
const mappings = [{"AimJsonPath": "root.b1","OrgJsonPath": "root.a.*","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "2","TranOP": "1","TranWay": "1"}}
];
/******************* 测试程序***************** */
let jsonTranferUtil = new JsonTranferUtil(jsonOrg, jsonAim, mappings);
let result = jsonTranferUtil.tranJson();
console.log("*************************最终转换结果*********************************")
console.log(JSON.stringify(result), 88888888888)

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

3.将源结构的“a.*”值追加到目标结构的“b1”值,使用高级配置中的转换操作【复制源子元素(新Key)】


import JsonTranferUtil from './json_transfer_new'
const jsonOrg = {"a": {"b": "1","c": {"c_child": "2"},"d": {"d_child": "3"}}
};
const jsonAim = {"b1": {    "k1": "v1","k2": {"k2_child": "v2_child"},"k3": {"k3_child": "v3_child"}}
};
/// 转换类型
/// 1:源Key->目标Key
/// 2:源Key->目标Value
/// 3:源Value->目标Key
/// 4:源Value->目标Value
const mappings = [{"AimJsonPath": "root.b1","OrgJsonPath": "root.a.*","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "1","TranOP": "2","TranWay": "1"}}
];
/******************* 测试程序***************** */
let jsonTranferUtil = new JsonTranferUtil(jsonOrg, jsonAim, mappings);
let result = jsonTranferUtil.tranJson();
console.log("*************************最终转换结果*********************************")
console.log(JSON.stringify(result), 88888888888) 

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

4.将源结构的“a.*”键追加到目标结构的“b1”值,高级配置中的转换操作【复制源子元素(原Key)】失效,默认为【复制源子元素(新Key)】


import JsonTranferUtil from './json_transfer_new'
const jsonOrg = {"a": {"b": "1","c": {"c_child": "2"},"d": {"d_child": "3"}}
};
const jsonAim = {"b1": {"k1": "v1","k2": {"k2_child": "v2_child"},"k3": {"k3_child": "v3_child"}}
};
/// 转换类型
/// 1:源Key->目标Key
/// 2:源Key->目标Value
/// 3:源Value->目标Key
/// 4:源Value->目标Value
const mappings = [{"AimJsonPath": "root.b1","OrgJsonPath": "root.a.*","TranType": 2,"Options": {"KeyInitIndex": 0,"AddElementsOption": "1","TranOP": "2","TranWay": "1"}}
];
/******************* 测试程序***************** */
let jsonTranferUtil = new JsonTranferUtil(jsonOrg, jsonAim, mappings);
let result = jsonTranferUtil.tranJson();
console.log("*************************最终转换结果*********************************")
console.log(JSON.stringify(result), 88888888888)

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

5.将源结构的“a.*.*”键替换到目标结构的“b1”值

注意:为了演示,我们将源模板中的a.b属性去掉了

import JsonTranferUtil from './json_transfer_new'
const jsonOrg = {"a": {"c": {"c_child": "2"},"d": {"d_child": "3"}}
};
const jsonAim = {"b1": {"k1": "v1","k2": {"k2_child": "v2_child"},"k3": {"k3_child": "v3_child"}}
};
/// 转换类型
/// 1:源Key->目标Key
/// 2:源Key->目标Value
/// 3:源Value->目标Key
/// 4:源Value->目标Value
const mappings = [{"AimJsonPath": "root.b1","OrgJsonPath": "root.a.*.*","TranType": 4,"Options": {"KeyInitIndex": 0,"AddElementsOption": "2","TranOP": "1","TranWay": "1"}}
];
/******************* 测试程序***************** */
let jsonTranferUtil = new JsonTranferUtil(jsonOrg, jsonAim, mappings);
let result = jsonTranferUtil.tranJson();
console.log("*************************最终转换结果*********************************")
console.log(JSON.stringify(result), 88888888888)

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

五、在线转换工具

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

工具地址:数据转换工具

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

六、技术资料

  • Github:edq-ebara/data-transformation-javascript: 数据转化(javascript) (github.com)
  • 技术探讨QQ群:775932762
  • 工具连接:数据转换工具

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

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

相关文章

赋值语句还能当判断条件?涨芝士了!

赋值和条件看似是C语言中毫不相关的两个概念,虽然实际过程中我猜测不会有太多这种不太符合常理的情况出现,但是现在在学习的过程中,为了出题而出题总是会整出一些花活出来.....这很难不让人联想起高中时一些大佬为了彰显自己的数学天赋而自己…

树莓派串口读取陀螺仪ky9250(mpu9250)数据

9轴姿态角度传感器,其中ky9250陀螺仪由于自带卡尔曼动态滤波算法方便用户使用。ky9250陀螺仪基本可以在各个平台上进行数据的读取(如stm32\arduino\C#\Matlab\树莓\Unity3d\python\ROS\英飞凌\Nvidia jetson linux 等) 1、树莓派和ky9250的接…

AcWing刷题-区间合并

校门外的树 区间合并: from typing import List def merge(intervals: List[List[int]]) -> List[List[int]]:# 按照第一个元素从小到大进行排序intervals.sort(keylambda x: x[0])# 初始化一个新的数组new_list list()for i in intervals:# 把第一个数组元素添…

基于ssm旅游资源网站(java项目+文档+源码)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的旅游资源网站。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 旅游资源网站的主要使用者分为管理…

机器学习每周挑战——旅游景点数据分析

数据的截图,数据的说明: # 字段 数据类型 # 城市 string # 名称 string # 星级 string # 评分 float # 价格 float # 销量 int # 省/市/区 string # 坐标 string # 简介 string # 是否免费 bool # 具体地址 string拿到数据…

【42 可视化大屏 | 某瓣电影Top250数据分析可视化大屏】

文章目录 🏳️‍🌈 1 普版大屏🏳️‍🌈2 Flask版大屏🏳️‍🌈3 FlaskMysql版大屏🏳️‍🌈 4. 可视化项目源码数据 大家好,我是 👉【Python当打之年(点击跳转)…

渐变色x轴换行柱状图

// 系统上云率const optionBar {title: {text: 系统上云率,left: left,textStyle: {color: "#fff",fontSize: 14,fontWeight: 650,align: "center",},},color: [#32C5FF, #00F766, #EECB5F],grid: {top: 40,bottom: 0,},legend: { // 控制图例组件show: …

数据结构·二叉树(2)

目录 1 堆的概念 2 堆的实现 2.1 堆的初始化和销毁 2.2 获取堆顶数据和堆的判空 2.3 堆的向上调整算法 2.4 堆的向下调整算法 2.4 堆的插入 2.5 删除堆顶数据 2.6 建堆 3 建堆的时间复杂度 3.1 向上建堆的时间复杂度 3.2向下建堆的时间复杂度 4 堆的排序 前言&…

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—解题全流程(论文更新)

【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索更新(论文更新) ​ 本节主要更新了论文、训练日志的log数据提取(Loss、ACC、RK)等数据可视化作图的代码 B题交流QQ群: 4583…

《乱弹篇(26)更好的自己》

俄乌、以巴、中东,烽火连天,持久酣战,搅得地球村住民不得安宁。虽说孰是孰非自有公论,但时评文难写也是评论界的普遍认知,所以今天笔者自觉地绕开时政话题,尽本“人民体验官”义务,推广人民日报…

【BY组态】轻量化web组态编辑器插件

演示地址:http://www.byzt.nethttp://www.byzt.net BY组态是一款非常优秀的纯前端的轻量化【web组态插件工具】,大小只有2M,可无缝嵌入到vue项目,react项目等,由于是原生js开发,对于前端的集成没有框架的限…

计算机网络-TCP/IP 网络模型

TCP/IP网络模型各层的详细描述: 应用层:应用层为应用程序提供数据传输的服务,负责各种不同应用之间的协议。主要协议包括: HTTP:超文本传输协议,用于从web服务器传输超文本到本地浏览器的传送协议。FTP&…

音视频开发之旅(80)- AI数字人-腾讯开源AniPortrait-音频驱动的肖像动画

目录 1、前言 2、效果展示 3、原理学习 4、遇到的问题与解决方案 5、资料 一、前言 一个月前阿里Emo发布,通过音频驱动的非常自然的肖像视频,引起很大反响。具体看下面的视频,但是并没有开源其代码。 这两天腾讯开源了其音频驱动的肖像…

基于微信小程序的付费自习室系统设计与实现,SpringBoot后端+毕业论文(13000字)

介绍 小程序端用户界面和管理员后台界面。用户端界面主要包括注册与登录页,首页、自习室页、我的页、座位预订页,资讯详情页等。管理员页面主要包括登录页、后台管理主页、用户管理页、资讯管理页、咨询管理页等。系统主要的模块包括自习室模块、自习室…

武汉星起航:亚马逊助力全球卖家拓展海外市场,消费潜力巨大

在全球化浪潮的推动下,跨境电商已成为众多企业开拓国际市场的重要途径。作为全球第一大电商平台的亚马逊,凭借其庞大的用户基数和覆盖全球的站点网络,正成为越来越多卖家开展海外业务的首选平台。亚马逊以其强大的销售潜力和影响力&#xff0…

【C++】C++入门第一课(c++关键字 | 命名空间 | c++输入输出 | 缺省参数)

目录 前言 C关键字 命名空间 1.命名空间的定义 A.标准命名空间定义 B.命名空间允许嵌套定义 C.同名命名空间的合并 2.命名空间的使用 加命名空间名称及作用限定符 使用using将命名空间中某个成员引入 使用using namespace命名空间名称引入 C的输入和输出 缺省参数…

【C语言】结构体详解(一)

目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问(两种方式) 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明(匿…

STL的string容器

string基本概念 string是C风格的字符串,本质上是一个类。 string 和 char* 的区别 char* 是一个指针; string是一个类,内部封装了 char* ,用来管理字符串,是一个 char* 型的容器。 特点 string内部封装了很多成员…

近年来,常见5大软件开发项目管理工具

时代进步,技术进步,汇总下近几年5大常用的软件开发项目管理工具。 1、微软项目管理软件 Microsoft Project(或MSP)是由微软开发销售的项目管理软件程序。软件设计目的在于协助项目经理制定发展计划、为任务分配资源、跟踪进度、管…

LeetCode 双指针专题

11.盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不…