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

news2024/10/8 21:46:12

文章目录

  • 一、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.coloradmin.cn/o/1568301.html

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

相关文章

基于PHP的校园招聘管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园招聘管理系统 一 介绍 此校园招聘管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为个人用户,企业和管理员三种。 技术栈:phpmysqlbootstrapphpstudyvscode 二…

JS——判断节假日(假日包括周末,不包括调休上班的周末)

思路:创建两个数组,数组1为节假日数组,数组2为是周末上班日期数组。如果当前日期(或某日期)同时满足2个条件(1.在节假日数组内或在周末。2.不在周末上班日期数组)即为节假日,否则即为…

Mybatis-Plus05(分页插件)

分页插件 MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能 1. 添加配置类 Configuration MapperScan("com.atguigu.mybatisplus.mapper") //可以将主类中的注解移到此处 public class MybatisPlusConfig {Bean public MybatisPlusIntercepto…

LeetCode-105. 从前序与中序遍历序列构造二叉树【树 数组 哈希表 分治 二叉树】

LeetCode-105. 从前序与中序遍历序列构造二叉树【树 数组 哈希表 分治 二叉树】 题目描述:解题思路一:暴力搜索解题思路二:哈希查找解题思路三: 题目描述: 给定两个整数数组 preorder 和 inorder ,其中 pr…

通过vite创建项目

一、VUE3官网 Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org) 二、通过Vite创建项目 1、在cmd窗口下,全局安装vite //使用国内镜像源 npm config set registryhttps://registry.npmmirror.com//安装最新版vite npm install -g vitelatest Vite | 下一代…

Python爬虫——基于JWT的模拟登录爬取实战

基于JWT的模拟登录爬取实战 JWT(JSON Web Token)主要由三部分组成: Header:包含了Token的类型(“typ”)和签名算法(“alg”)信息。通常情况下,这个部分会指定为{"…

ChatGPT 之创造力与沟通的演化

原文:ChatGPT … The Evolution of Creativity and Communication 译者:飞龙 协议:CC BY-NC-SA 4.0 作者注 亲爱的读者, ChatGPT,一位 AI 专家和一位律师走进了一家酒吧。酒保看着他们说:“这是什么&…

企业邮箱给谷歌Gmail报错550-5.7.25解决方案

企业邮箱给谷歌Gmail报错550-5.7.25解决方案 问题表现 今天接到同事报告企业邮箱发送报错的问题,具体问题表现如下: 我司内部邮箱 xxXXX.com 邮箱给国内的163和新浪和企业内部发送邮件可以成功给Hotmail发送邮件,成功。给Gmail发送邮件&am…

java计算机网络(一)-- url,tcp,udp,socket

网络编程: 计算机网络 计算机网络指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。 网络协议…

前端工程师————CSS学习

选择器分类 选择器分为基础选择器和复合选择器 基础选择器包括:标签选择器,类选择器,id选择器,通配符选择器标签选择器 类选择器 语法:.类名{属性1: 属性值;} 类名可以随便起 多类名使用方式&am…

华为openEuler-22.03-LTS-SP3配置yum源

先有华为后有天,遥遥领先! 1 确定使用的OS版本 # cat /etc/os-release NAME"openEuler" VERSION"22.03 (LTS-SP3)" ID"openEuler" VERSION_ID"22.03" PRETTY_NAME"openEuler 22.03 (LTS-SP3)" ANSI…

深度解析大语言模型中的词向量

在学习完语言模型中的编码器与解码器知识后,让我们继续深入学习大语言模型中一个非常关键的技术:词向量表示,以及如何通过Transformer模型实现对next token的预测。 1、词向量 要了解语言模型的工作原理,首先需要了解它们如何表示…

VSCode美化

今天有空收拾了一下VSCode,页面如下,个人觉得还是挺好看的~~ 1. 主题 Noctis 色彩较多,有种繁杂美。 我使用的是浅色主题的一款Noctis Hibernus 2. 字体 Maple Mono 官网:Maple-Font 我只安装了下图两个字体,使…

UE4_普通贴图制作法线Normal材质

UE4 普通贴图制作法线Normal材质 2021-07-02 10:46 导入一张普通贴图: 搜索节点:NormalFromHeightmap 搜索节点:TextureObjectparameter,并修改成导入的普通贴图,连接至HeightMap中 创建参数normal,连接…

32. UE5 RPG使用增强输入激活GameplayAbility(二)

在上一篇文章中,我们实现了Tag和InputAction的数据对应,后面,我们会通过InputAction触发对应的Tag,然后在GameplayAbility身上设置对应的Tag,然后通过Tag遍历角色身上的所有应用的技能去激活。为了实现这个功能&#x…

数据结构进阶篇 之 【交换排序】(冒泡排序,快速排序递归、非递归实现)

当你觉的自己不行时,你就走到斑马线上,这样你就会成为一个行人 一、交换排序 1.冒泡排序 BubbleSort 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 冒泡排序的特性总结 2.快速排序 QuickSort 2.1 基本思想 2.2 递归实现 2.2.1 hoare版 2.2.2 …

蓝桥杯真题:递增序列

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main {public static int is1(char ch[][],int m,int n){int ans0;for (int i0;i<m;i){for (int j0;j<n;j){int add1;while(jadd<n){if(ch[i][j]<ch[i][jadd]) ans; //横…

MySQL - 基础二

6、表的增删改查 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 6.1、Create 语法&#xff1a; INSERT [INTO] table_name[(column [, column] ...)]VALUES (value_list) [, (value_list)] ...value_list: v…

JAVA学习笔记22(面向对象三大特征)

1.面向对象三大特征 ​ *封装、继承和多态 1.1 封装 ​ 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作*[方法**]封装在一起&#xff0c;数据被保护在内部&#xff0c;程序的其它部分只有通过被授权的操作[方法]&#xff0c;方能对数据进行操作 ​ 1.封装的理…

椋鸟数据结构笔记#6:堆及其实现

文章目录 堆的概念堆的实现由数组调整为堆堆向下调整算法通过向下调整算法构建堆 从空堆开始插入节点堆向上调整算法通过向上调整算法构建堆 删除堆顶的元素实现代码 堆的作用 萌新的学习笔记&#xff0c;写错了恳请斧正。 堆的概念 如果有一个关键码的集合 K { k 0 , k 1 , …