javascript json对象操作(基本增删改查)
/**
* Json对象操作,增删改查
*
* @author lellansin
* @blog www.lellansin.com
* @version 0.1
*
* 解决一些常见的问题
* get/set 解决获取和设置时,无节点中断的问题
* create 可以创建多级节点,若存在则覆盖新值
* delete 删除节点及其子节点
* print_r 格式化输出对象(调试用)
* 实例见底部
*/ function Json() { } /**
* 获取Json对象中的某个节点
* 例如:json.get(Data, 'country', 'province', 'city');
* 结果则返回 Data['country']['province']['city']
* 无则返回false
*/
Json.prototype.get = function(obj, key) {
var args = this.get.arguments;
var result = obj; for (var i = 1; i < args.length; i++) {
result = result[args[i]];
if (result === undefined) {
return false;
};
};
return result;
}; /**
* 设置Json对象中的某个节点
* 例如:obj.set(data, "ENTRY", "FA_TOKEN_INVALID", 1234);
* 将 data['ENTRY']['FA_TOKEN_INVALID'] 设置为1234
* 成功true, 失败false
*/
Json.prototype.set = function(obj, key) {
var args = this.set.arguments;
if (ergodic_set(obj, args, 1)) {
return true;
} else {
return false;
}
}
/**
* 在Json对象中创建节点(若存在则覆盖值)
* 例如:obj.create(data, 'add', 'hello', 'test', 120);
* 添加 data['create']['hello']['test'] 节点并设置值为 120
* 成功true, 失败false
*/
Json.prototype.create = function(obj, key) {
var args = this.create.arguments;
if (ergodic_create(obj, args, 1)) {
return true;
} else {
return false;
}
} /**
* 在Json对象中删除节点
* 例如:obj.delete(prods, 'grade', 'math');
* 成功true, 失败false
*/
Json.prototype.delete = function(obj, key) {
var args = this.delete.arguments;
if (ergodic_delete(obj, args, 1)) {
return true;
} else {
return false;
}
} /**
* 返回Json对象的字符串形式(封装 ECMAScript 库函数)
*/
Json.prototype.getStr = function(obj) {
return JSON.stringify(obj);
} /**
* 解析字符串返回Json对象(封装 ECMAScript 库函数)
*/
Json.prototype.getJson = function(str) {
return JSON.parse(str);
} /**
* 格式化输出Json对象
*/
Json.prototype.print_r = function(obj) {
console.log("{")
ergodic_print(obj, "");
console.log("}")
} function ergodic_print(obj, indentation) {
var indent = " " + indentation;
if (obj.constructor == Object) {
for (var p in obj) {
if (obj[p].constructor == Array || obj[p].constructor == Object) {
console.log(indent + "[" + p + "] => " + typeof(obj) + "");
console.log(indent + "{");
ergodic_print(obj[p], indent);
console.log(indent + "}");
} else if (obj[p].constructor == String) {
console.log(indent + "[" + p + "] => '" + obj[p] + "'");
} else {
console.log(indent + "[" + p + "] => " + obj[p] + "");
}
}
}
} function ergodic_set(obj, args, floor) {
if (obj.constructor == Object) {
for (var tmpKey in obj) {
if (tmpKey == args[floor]) {
if (floor < args.length - 2) {
return ergodic_set(obj[tmpKey], args, floor + 1);
} else {
// 此时参数floor为倒数第二个,加1值为最后一个
obj[tmpKey] = args[floor + 1];
console.log("成功设置,返回true");
return true;
}
}
}
}
} function ergodic_create(obj, args, floor) {
if (obj.constructor == Object) {
for (var tmpKey in obj) {
if (tmpKey == args[floor]) {
if (floor < args.length - 2) {
return ergodic_create(obj[tmpKey], args, floor + 1);
} else {
obj[tmpKey] = args[floor + 1];
return true;
}
}
}
}
// 节点不存在,创建新节点
if (floor < args.length - 1) {
var jsonstr = getJsonFormat(args[args.length - 1]); for (var i = args.length - 2; i > floor; i--) {
jsonstr = '{"' + args[i] + '":' + jsonstr + '}';
}; // 使用eval解析第三方Json数据时,可能会执行恶意代码
// var node = eval('(' + jsonstr + ')');
var node = JSON.parse(jsonstr);
obj[args[floor]] = node;
return true;
}
} function ergodic_delete(obj, args, floor) {
if (obj.constructor == Object) {
for (var tmpKey in obj) {
if (tmpKey == args[floor]) {
if (floor < args.length - 1) {
return ergodic_delete(obj[tmpKey], args, floor + 1);
} else {
delete obj[tmpKey];
return true;
}
}
}
}
} function getJsonFormat(param) {
if (param.constructor == String) {
return '"' + param + '"';
} else {
return param;
}
} /**
* 使用实例
*/ var data = {
OK: 200,
FAIL: 500,
ENTRY: {
FA_TOKEN_INVALID: 1001,
FA_TOKEN_EXPIRE: 1002,
FA_USER_NOT_EXIST: 1003
},
GATE: {
FA_NO_SERVER_AVAILABLE: 2001
},
CHAT: {
FA_CHANNEL_CREATE: 3001,
FA_CHANNEL_NOT_EXIST: 3002,
FA_UNKNOWN_CONNECTOR: 3003,
FA_USER_NOT_ONLINE: 3004
}
}; var json = new Json(); console.log("获取Json中节点");
console.log(json.get(data, "OK")); // 200
console.log(json.get(data, "ENTRY", "FA_TOKEN_INVALID")); // 1001
console.log(json.get(data, "TEST", "获取没有的节点")); // false 没有的节点返回 false console.log("设置Json中节点");
console.log(json.set(data, "ENTRY", "FA_TOKEN_INVALID", 1234)); // true 设置成功
console.log(json.get(data, "ENTRY", "FA_TOKEN_INVALID")); // 1234 获取刚设置的节点
console.log(json.set(data, "ENTRY", "测试设置没有的节点", 1234)); // false 设置失败 console.log("创建新的Json节点");
var prods = {
'name': 'Alan',
'grade': {
'Chinese': 120,
'math': 130,
'competition': {
'NOI': 'First prize'
}
}
};
console.log(json.create(prods, 'create', 'hello', 'test', 120)); // true
console.log(json.create(prods, 'create', 'hello', 'test2', '通过')); // true console.log("格式化输出节点");
json.print_r(prods); console.log("删除节点");
console.log(json.delete(prods, 'grade', 'math')); // true
console.log(json.delete(prods, 'grade', 'competition')); // true
console.log(json.delete(prods, 'grade', '删除没有的节点')); // false
json.print_r(prods);
javascript json对象操作(基本增删改查)的更多相关文章
- JavaScript JSON简单操作(增删改)
JavaScript 中对json处理: 声明;: var json={};或 json={"name":"asd","age":24}; ...
- 使用python操作XML增删改查
使用python操作XML增删改查 什么是XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输 ...
- js操作indexedDB增删改查示例
js操作indexedDB增删改查示例 if ('indexedDB' in window) { // 如果数据库不存在则创建,如果存在但是version更大,会自动升级不会复制原来的版本 var r ...
- python之类与对象属性的增删改查
类属性与对象属性的增删改查 类属性的增删改查 class School: """ 文档 """ Teacher = "老王&quo ...
- MySQL数据分析(16)— 数据操作之增删改查
前面我们说学习MySQL要从三个层面,四大逻辑来学,三个层面就是库层面,表层面和数据层面对吧,数据库里放数据表,表里放数据是吧,大家可以回忆PPT中jacky的这图,我们已经学完了库层面和表层面,从本 ...
- Redis简单的数据操作(增删改查)
#Redis简单的数据操作(增删改查): 字符串类型 string 1. 存储: set key value 127.0.0.1:6379> set username zhangsan OK 2 ...
- JavaScript(JS)之Javascript对象DOM之增删改查(四)
创建节点:var ele_a = document.createElement('a');添加节点:ele_parent.appendChild(ele_img);删除节点:ele_parent.re ...
- 超详细的DOM操作(增删改查)
操作DOM的核心就是增删改查 原文地址:https://jianshu.com/p/b0aa846f4dcc 目录 一.节点创建型API 1.1 createElement 1.2 createTex ...
- MongoDB基础入门002--基本操作,增删改查
一.这里只是演示最基本的操作,更多的信息可以去官网.https://docs.mongodb.com/manual 打开一个cmd,输入mongo命令打开shell,其实这个shell就是mongod ...
随机推荐
- 八、angularjs 中 filter在controller中的使用--避免多次遍历
filter在html页面的使用司空见惯,比如: filter在controller中使用可以避免多次使用angular.foreach,来进行遍历.例如: 如果使用filter,则会让代码简洁而且明 ...
- vue知识day1
HTML语义.CSS:样式 js:行为 jQuery:简化了js操作 boostrap :框架 ,以类方式展现 react:facebook 公司的产品 angular:谷歌公司产品 vue:作者尤雨 ...
- INSERT 语句总结
一.基本语句 1.向指定的列中插入值(在插入批量数据时方式2优于方式1) <!--插入一条值--> INSERT INTO t1(field1,field2) VALUE(v001,v00 ...
- c#之委托事件(DelegateEvent)
前面一章学习了委托以及多播委托,接下来我们来学习下委托事件. 在学习委托事件的前提下,得知道什么是观察者模式. 首先,我们来模拟一个场景:例如,当一只狗汪汪汪叫的时候,baby被吓哭了,刚好要偷东西的 ...
- JavaScript停止事件冒泡和取消事件默认行为
功能:停止事件冒泡 function stopBubble(e) { // 如果提供了事件对象,则这是一个非IE浏览器 if ( e && e.stopPropagation ) { ...
- asp.net的HTTP请求处理过程
1.asp.net的HTTP请求处理过程 说明: (1).客户端浏览器向服务器发出一个http请求,此请求会被inetinfo.exe进程截获,然后转交给aspnet_isapi.dll进程,接着它又 ...
- django的orm操作的补充
---恢复内容开始--- 你在建立一个登陆的时候需要用到auth这个用户登陆模块 这个时候就需要用到user表中的信息你就可以继承 这个时候我们的用户表中继承我们user继承的表 ABstractUs ...
- js 图形化工作流设计器
最近比较闲,打算开发一个用js 写的 图形化工作流设计器,附上草图一张,要看运行效果请下载附件,这个版本还在开发中,以后会持续更新,直到满意为止.上面的列子虽然变形,我还是贴出来了,给大家一个 ...
- DIY简单功能的torrentkitty种子爬虫
过完年回公司比较无聊,一不小心看到微博里美尤莉娅的图片,惊为天人,有图为证!!! 百度之原来这货以前叫小泉彩,貌似动了几个小手术换了个马甲重新出道了.你拍AV你家里知道么?.于是乎下了几个种子看了下, ...
- vue-cli + webpack自动生成项目
# 全局安装 vue-cli $ npm install --global vue-cli # 创建一个基于 webpack 模板的新项目 $ vue init webpack palanWebsit ...