更改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)的 ...
随机推荐
- Error creating bean with name ‘com.ai.ecs.ecop.pointExchange.service.NewGoodsService‘
Error creating bean with name 'com.ai.ecs.ecop.pointExchange.service.NewGoodsService' 查看服务注册中心的格式是否正 ...
- 二、Kubernetes 概念介绍
一.Master Master指的是集群控制节点,在每个Kubernetes集群里都需要有一个Master来负责整个集群的管理和控制,基本上Kubernetes的所有控制命令都发给它,它负责具体的 ...
- 在FreeSQL中实现「触发器」和软删除功能
前言 最近做新项目,技术栈 AspNetCore + FreeSQL 这个ORM真的好用,文档也很完善,这里记录一下两个有关「触发器」的功能实现 修改实体时记录更新时间 模型代码 我的模型都是基于这个 ...
- Codeforces 1670 E. Hemose on the Tree
题意 给你个数p,n = 2^p: 有一棵树有n个节点,告诉你怎么连边: 每个点有个权值,每条边也有个权值,权值需要自行分配,[1,2,3..n...2n-1],总共2n-1个权值: 你需要选一个节点 ...
- 怎么样子盒子能撑起父盒子?浮动,BFC,边距重叠
怎么样子盒子能撑起父盒子? 从行内元素跟块元素来看: 一般情况下,行内元素只能包含数据和其他行内元素. 而块级元素可以包含行内元素和其他块级元素. 块级元素内部可以嵌套块级元素或行内元素. 建议行内元 ...
- Golang 加密方法
如果想直接使用我下列的库 可以直接go get 我的github go get -u github.com/hybpjx/InverseAlgorithm md5 加密--不可逆 MD5信息摘要算法是 ...
- xlwings 模块总结
基本使用 在子线程中使用时,有时需要在子线程函数中加入以下.有时不需要加入,目前还不明白具体的原因 import pythoncom # 导入的库 pythoncom.CoInitialize() # ...
- mindxdl--common--head_handler.go
// Copyright (c) 2021. Huawei Technologies Co., Ltd. All rights reserved.// Package common the commo ...
- 本地GoLand编辑与调试远端服务器上的代码
Goland是专为Go开发人员构建的跨平台IDE,功能非常强大,拥有强大的代码洞察力,帮助所有Go开发人员即时错误检测和修复建议,快速和安全的重构,一步撤销,智能代码完成,死代码检测和文档提示,让您创 ...
- EluxJS-让你像切蛋糕一样拆解前端巨石应用
大家好,EluxJS是一套基于"微模块"和"模型驱动"的跨平台.跨框架『同构方案』,欢迎了解... 可怕的巨石怪 工作中最可怕的是什么?是遇到业务复杂且乱作一团 ...