更改json节点key
json节点key更改,给朋友写的小tool,顺便记录一下
单个指定
每一个需要修改的key,都需要指定
/**
* 需要转义的key对象
* 原key: 新key
*/
const jsonKeysTo = {
'a': 'new_a',
'b': 'new_b',
'c>0>a': 'new_c'
}; /**
* 数据对象
*/
let json = {
a: 'aaa',
b: 123,
c: [
{
a: 1,
f: 2
},{
a: 1
}
]
}; /**
* 遍历并替换key
* @param {Object} root 当前遍历对象
* @param {Object} path 当前遍历节点路径
* @param {Object} data_source 源数据对象
*/
function jsonNodeRead(root, path, data_source) {
let tpkey;
if (!path) {
path = [];
}
if (!data_source) {
data_source = root;
}
Object.keys(root).forEach(k => {
if (typeof root[k] == 'object') { // 如果是对象则继续遍历
jsonNodeRead(root[k], path.concat(k), data_source);
} else {
jsonNodeTo(data_source, path.concat(k));
}
});
} /**
* @param {Object} root 数据源
* @param {Object} path 节点路径(数组)
*/
function jsonNodeTo(root, path) {
let toKey = path.join('>');
if (jsonKeysTo.hasOwnProperty(toKey)) {
let tp = eval('root["' + path.join('"]["') + '"]'); // 取出节点对象
eval('delete root["' + path.join('"]["') + '"]'); // 删除节点
path.pop(); // 删除最后一个元素
path.push(jsonKeysTo[toKey]); // 追加元素
eval('root["' + path.join('"]["') + '"] = tp'); // 添加节点
}
} console.log(JSON.parse(JSON.stringify(json)));
jsonNodeRead(json);
console.log(json);
模糊匹配
用的是正则匹配,可能含有小bug
/**
* 需要转义的key对象
* 原key -> 新key
* 原key: >指向子节点,杠*杠为通配符,key最终转为正则对象
* 新key: 字符串
*/
const jsonKeysTo = {
'a': 'new_a',
'b': 'new_b',
'c>/*/>a': '3_c',
'c>/*/>/*/>a': '4_c'
}; /**
* 数据对象
* key内不能含有>符号
*/
let json = {
a: 'aaa',
b: 123,
c: [
{
a: 1,
f: 2
},{
a: 1,
f: 2,
'd发!!。、——1': {
a: 123
}
}
]
}; /**
* 遍历并替换key
* @param {Object} root 当前遍历对象
* @param {Object} path 当前遍历节点路径
* @param {Object} data_source 源数据对象
*/
function jsonNodeRead(root, path, data_source) {
let tpkey;
if (!path) {
path = [];
}
if (!data_source) {
data_source = root;
}
Object.keys(root).forEach(k => {
if (typeof root[k] == 'object') { // 如果是对象则继续遍历
jsonNodeRead(root[k], path.concat(k), data_source);
} else {
jsonNodeTo(data_source, path.concat(k));
}
});
} /**
* @param {Object} root 数据源
* @param {Object} path 节点路径(数组)
*/
function jsonNodeTo(root, path) {
let toKey = path.join('>'), toVal;
let keys = Object.keys(jsonKeysTo);
let toRegex = '[\\u4e00-\\u9fa5\\d\\w\\s\\-\\_\\+\\^\\$\\|\\&\\*\\?\\.\\(\\)\\{\\}\\[\\]~@#%=<!!。—《》【】‘“::、,,?]+';
let to = false;
for(let i = 0; i < keys.length; i++) {
// console.log('^' + keys[i].replace(/\/\*\//g, toRegex) + '$', ' --> ', toKey);
if (new RegExp('^' + keys[i].replace(/\/\*\//g, toRegex) + '$').test(toKey)) {
console.log(keys[i], ' --> ', toKey);
to = true;
toVal = jsonKeysTo[keys[i]];
break;
}
}
if (to) {
let tp = eval('root["' + path.join('"]["') + '"]'); // 取出节点对象
eval('delete root["' + path.join('"]["') + '"]'); // 删除节点
path.pop(); // 删除最后一个元素
path.push(toVal); // 追加元素
eval('root["' + path.join('"]["') + '"] = tp'); // 添加节点
}
} console.log(JSON.parse(JSON.stringify(json)));
jsonNodeRead(json);
console.log(json);
更改json节点key的更多相关文章
- js 更改json的 key
let t = data.map(item => { return{ fee: item['费用'], companyName1: item.companyName, remark1: item ...
- java 扁平化输出json所有节点key/value
本章主要介绍用java实现扁平化输出json所有节点key/value(包含所有内层子节点) 1.json结构 目的输出bill_list下的datalist里的子节点key/value 2.实现代码 ...
- c++中对于json的key不带双引号的问题修复
在引用了第三方数据时,数据源通过转义,将json的key上双引号给去掉了. 在PHP开发时,可以通过正则表达式替换方式来补充丢失的双引号,处理代码如下 function ex_json_decode( ...
- fastjson转换json字符串key的首字母小写变大写的解决办法
https://blog.csdn.net/erbao_2014/article/details/53688934 问题描述在开发过程中,由于接口文档的描述,要求json字符串的key首字母为大写,而 ...
- 对json数据key进行替换
原文:https://blog.csdn.net/qq_39750658/article/details/83411897 import java.util.HashMap; import java. ...
- js遍历json的key和value
遍历json对象: 无规律: <script> var json = [{dd:'SB',AA:'东东',re1:123},{cccc:'dd',lk:'1qw'}]; for(var i ...
- 转:js获取json中key所对应的value值
<script type="text/javascript"> getJson('age'); function getJson(key){ var jsonObj={ ...
- C# parser JSON get Key and value
/*********************************************************************** * C# parser JSON get Key an ...
- js json按key值排序
最近有个需求需要把json按key值进行排序,可是js并没有直接的函数可以对json进行排序的这么办呢? 然后想到了一个间接的方法来实现: 1.将json中的key值取出,存在一个数组中,然后对这个数 ...
- Python解析非标准JSON(Key值非字符串)
采集数据的时候经常碰到一些JSON数据的Key值不是字符串,这些数据在JavaScript的上下文中是可以解析的,但在Python中,没有该部分数据的上下文,无法采用json.loads(JSON)的 ...
随机推荐
- 在vue中的form表单中下拉框中的数据来自数据库查询到的数据
文章目录 1.实现的效果: 2.前端html代码 3.js中的代码 4.后端的方法 1.实现的效果: 增加一个新的类型到数据库 2.前端html代码 需要注意的部分:prop后边是表单中的字段 v-m ...
- Vue学习之--------el与data的两种写法、MVVM模型、数据代理(2022/7/5)
文章目录 1.el与data的两种写法 1.1.基础知识 1.2.代码实例 1.3.页面效果 2.MVVM模型 2.1. 基础知识 2.2 .代码实例 2.3.页面效果 3.数据代理 3.1. 基础知 ...
- 齐博x1背景图如何设置标签
背景图非常特殊,由于不能点击,所以他不能直接添加标签,需要添加一个辅助标签,比如类似下面的代码 {qb:hy name="xxa001" type="image" ...
- MySQL 主从复制一主两从环境配置实战
MySQL 初始化 MySQL 主从复制是指数据可以从一个 MySQL 数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式;从节点可以复制主数据库中的所有数据库或者特定的数据库 ...
- 从0搭建vue3组件库: 如何完整搭建一个前端脚手架?
相信大家在前端开发中都使用过很多前端脚手架,如vue-cli,create-vite,create-vue等:本篇文章将会为大家详细介绍这些前端脚手架是如何实现的,并且从零实现一个create-kit ...
- SQL--Row_Number() over()的使用
1.语法 --over里面有两个参数 --partition by 用于分割区域 此参数可选 --order by 用于排序 此参数必有 row_number() over(partition by ...
- PMM实现监控Mysql-MGR
一.docker安装PMM服务端 1.安装yum配置单元 # 如果已安装,略过此步 yum install -y yum-utils #yum配置单元 2.配置docker阿里云yum源 #配置doc ...
- JS 学习笔记 (六) 函数式编程
1.函数闭包 1.1 概述 JavaScript采用词法作用域,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 为了实现这种词法作用域,JavaScript函数对 ...
- 嵌入式-C语言基础:字符串比较函数strcmp及其实现
#include<stdio.h> #include <string.h> int mystrcmp(char * p1,char * p2) { int ret=0; if( ...
- 23、有一个字符串,包含n个字符,编写一函数,将此字符串中从第m个字符开始的全部字符串复制成另一个字符串
/* 有一个字符串,包含n个字符,编写一函数,将此字符串中从第m个字符开始的全部字符串复制成另一个字符串 */ #include <stdio.h> #include <stdlib ...