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的更多相关文章

  1. js 更改json的 key

    let t = data.map(item => { return{ fee: item['费用'], companyName1: item.companyName, remark1: item ...

  2. java 扁平化输出json所有节点key/value

    本章主要介绍用java实现扁平化输出json所有节点key/value(包含所有内层子节点) 1.json结构 目的输出bill_list下的datalist里的子节点key/value 2.实现代码 ...

  3. c++中对于json的key不带双引号的问题修复

    在引用了第三方数据时,数据源通过转义,将json的key上双引号给去掉了. 在PHP开发时,可以通过正则表达式替换方式来补充丢失的双引号,处理代码如下 function ex_json_decode( ...

  4. fastjson转换json字符串key的首字母小写变大写的解决办法

    https://blog.csdn.net/erbao_2014/article/details/53688934 问题描述在开发过程中,由于接口文档的描述,要求json字符串的key首字母为大写,而 ...

  5. 对json数据key进行替换

    原文:https://blog.csdn.net/qq_39750658/article/details/83411897 import java.util.HashMap; import java. ...

  6. js遍历json的key和value

    遍历json对象: 无规律: <script> var json = [{dd:'SB',AA:'东东',re1:123},{cccc:'dd',lk:'1qw'}]; for(var i ...

  7. 转:js获取json中key所对应的value值

    <script type="text/javascript"> getJson('age'); function getJson(key){ var jsonObj={ ...

  8. C# parser JSON get Key and value

    /*********************************************************************** * C# parser JSON get Key an ...

  9. js json按key值排序

    最近有个需求需要把json按key值进行排序,可是js并没有直接的函数可以对json进行排序的这么办呢? 然后想到了一个间接的方法来实现: 1.将json中的key值取出,存在一个数组中,然后对这个数 ...

  10. Python解析非标准JSON(Key值非字符串)

    采集数据的时候经常碰到一些JSON数据的Key值不是字符串,这些数据在JavaScript的上下文中是可以解析的,但在Python中,没有该部分数据的上下文,无法采用json.loads(JSON)的 ...

随机推荐

  1. hmtl5 web SQL 和indexDB

    前端缓存有cookie,localStorage,sessionStorage,webSQL,indexDB: cookie:有缺点 localStorage:功能单一 sessionStorage: ...

  2. 2022-08-21-xdm说个事啊

    layout: post cid: 15 title: xdm说个事啊 slug: 15 date: 2022/08/21 13:06:34 updated: 2022/08/21 13:06:34 ...

  3. 一天十道Java面试题----第二天(HashMap和hashTable的区别--------》sleep、wait、join)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 11.HashMap和HashTable的区别及底层实现 12.ConcurrentHashMap原理简述,jdk7和jd ...

  4. HTML+CSS基础知识(4)简单的广告界面

    文章目录 1.网页实例 1.1 代码 1.2 测试效果 1.网页实例 1.1 代码 css样式 /* 清除页面样式 */ *{ margin:0; padding: 0; } /* 统一页面的样式 * ...

  5. 齐博x1.1用户登录接口

    用户的登录主要涉及到小程序登录.APP的帐号密码登录.APP的微信开发平台帐号登录.相应的地址是:http://qb.net/index.php/index/wxapp.login/index.htm ...

  6. 关于 Vue 中 h() 函数的一些东西

    最近在项目上需要一个信息弹窗,来显示信息.一开始只让它弹出了文字,而且只有一条信息.而给我的需求是多条文字和图片,而后我使用了element ui中的 Notification 通知组件来显示.当然, ...

  7. LcdToos如何在线调屏PORCH参数

    在点屏过程中,我们会经常碰到画面对不齐现象,在这种情况下需要多次尝试修调屏的PORCH参数来使画面显示正常:通常的做法是修改完PORCH参数下载到PG,点亮看效果,这种方法无疑效率很低,对于现象的表现 ...

  8. Debian安装 WineHQ 安装包

    https://wiki.winehq.org/Debian_zhcn WineHQ 源仓库的密钥于 2018-12-19 改变过.如果您在此之前下载添加过该密钥,您需要重新下载和添加新的密钥并运行 ...

  9. R数据分析:孟德尔随机化实操

    好多同学询问孟德尔随机化的问题,我再来尝试着梳理一遍,希望对大家有所帮助,首先看下图1分钟,盯着看将下图印在脑海中: 上图是工具变量(不知道工具变量请翻之前的文章)的模式图,明确一个点:我们做孟德尔的 ...

  10. 【题解】CF1714F Build a Tree and That Is It

    题面传送门 解决思路 题目中虽然说是无根树,但我们可以钦定这棵树的根为节点 \(1\),方便构造,这是不 影响结果的. 以下记给定的三段长度为 \(a,b,c\). 先考虑无解的情况. 首先,给出的三 ...