更改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)的 ...
随机推荐
- Tableau Server 常用命令
Tableau Server 常用命令 1> 停止tableau server服务 tabadmin stop 2> 恢复tableau server数据 tabadmin restore ...
- dotnet 用 SourceGenerator 源代码生成技术实现中文编程语言
相信有很多伙伴都很喜欢自己造编程语言,在有现代的很多工具链的帮助下,实现一门编程语言,似乎已不是一件十分困难的事情.我利用 SourceGenerator 源代码生成技术实现了一个简易的中文编程语言, ...
- python django搭建一个简易博客的解析(按照文件顺序逐一讲解)
上次讲解了一下各py文件的内容,但比较乱,所以这次整理了一个顺序版. 源代码请在http://github/Cheng0829/mysite自行下载 mysite: db.sqlite3:数据库文件. ...
- 1.pygame快速入门-创建游戏窗口
简介 pygame是python一个包,专为电子游戏设计#安装 pip3 install pygame #验证安装 # aliens 是pygame内置的一个小游戏,可以启动成功说明pygame安 ...
- Spring源码知识
bean的生命周期: 实例化:在堆空间中申请内存,使用反射来实现:(createBeanInstance) 自定义属性赋值(setter).容器对象属性赋值(invokeAwareMethods) 前 ...
- Java 编码那些事(二)
建议先阅读:Java 编码那些事(一) 现在说说编码在Java中的实际运用.在使用tomcat的时候,绝大部分同学都会遇到乱码的问题,查查文档,google一下解决方案啥的,都是设置这里,设置那里,或 ...
- Django系列---开发三 前后端分离
数据交互接口规范REST,全称 Representational State Transfer,意为"表现层状态转化". django的第三方拓展--django-rest-fra ...
- 23种设计模式之自定义Spring框架(五)
7,自定义Spring框架 7.1 spring使用回顾 自定义spring框架前,先回顾一下spring框架的使用,从而分析spring的核心,并对核心功能进行模拟. 数据访问层.定义UserDao ...
- 备考CISP-PTE之文件上传
upload-labs 直接下载放到phpstudy打开即可. 第一关 查看源码,可以看到js代码定义了一个checkFile函数来对上传的文件进行后缀检查,只允许上传jpg.png.gif文件. f ...
- Python中 or、and 的优先级
上式可以看出 先看 and 输出才为 ture 因此 优先级 and>or