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);

  

原文地址:https://www.cnblogs.com/yangsg/p/10751547.html

时间: 2024-08-26 15:03:33

javascript json对象操作(基本增删改查)的相关文章

js操作indexedDB增删改查示例

js操作indexedDB增删改查示例 if ('indexedDB' in window) { // 如果数据库不存在则创建,如果存在但是version更大,会自动升级不会复制原来的版本 var req = indexedDB.open("TestDB", 1); req.onupgradeneeded = function(e) { var db = req.result; // var store = db.createObjectStore("student"

Redis简单的数据操作(增删改查)

#Redis简单的数据操作(增删改查): 字符串类型 string 1. 存储: set key value 127.0.0.1:6379> set username zhangsan OK 2. 获取: get key 127.0.0.1:6379> get username "zhangsan" 以下同理: 127.0.0.1:6379> set age 23 OK 127.0.0.1:6379> get age "23" 127.0.0

【JavaScript】网页节点的增删改查

一.基本概念 这部分也就是所谓的"HTML DOM",所谓HTML DOM也就是Web页面加载规则,是一个规则,也就是网页组成的基本公式. 也就是所有网页都必须按照:<html><body></body></html>--的规则编写,也按照这样的规则加载. 所谓的"网页节点",也叫"DOM节点"的通俗解释,例如html节点下的内容就是<html></html>之间所有内容,b

JavaScript之实现基本的增删改查功能

开心一笑 听说这两天,全国都很冷.福建人说1度好冷,北京人笑了:我们这零下17度.黑龙江人也笑了:我们这零下33度.呼伦贝尔人听到哈哈大笑:我们这零下43度.福建人听完冷笑一声:我说的是室内,室内,室内 提出问题 如何利用原生的js实现基本的增删改查功能 解决问题 包含两个文件(index.jsp 和 index.js) <%@ page language="java" contentType="text/html; charset=UTF-8" pageEn

Djaogo-Model操作数据库(增删改查、连表结构)

一.数据库操作 1.创建model表 基本结构 1 2 3 4 5 6 from django.db import models    class userinfo(models.Model):     #如果没有models.AutoField,默认会创建一个id的自增列     name = models.CharField(max_length=30)     email = models.EmailField()     memo = models.TextField() 更多字段: 1

Java操作MongoDB增删改查完美Demo

--因为实习工作需要,在学MongoDB,参考了公司的一个MongDB服务类,写了一个整合的Demo,涉及到的大部分的增删改查操作,而且还算规范,给大家参考!源代码:(完整项目文件下载链接:点击打开链接)http://download.csdn.net/detail/zhangliangzi/9555872 使用说明: 一.MongoDB数据库参数配置 1.推荐使用mongodb.cfg.properties配置,则在构造MongoDBService对象的时候只需调用无参构造方法即可自动完成配置

java使用dom4j操作XML增删改查-超简洁

一.前言 1.使用工具:eclipse    环境:JDK-11 2.类说明:共四个类:Zen   |  Shan  |   Gai   |   Cha   (一个类只做一件事,简单明了) 3.引用jar包:dom4j-1.6.1.jar 4.反馈方式:邮箱 [email protected] 5.使用的源XML名为:Humen.xml  内容如下 二.源码 1.在源XML基础上添加新的 节点.属性.文本内容 /** * 作者:向家康 * 版权所有 禁止转发 */package 正式版.XML.

Django-Model操作数据库(增删改查、连表结构)

一.数据库操作 1.创建model表 基本结构 1 from django.db import models 2 3 class userinfo(models.Model): 4 #如果没有models.AutoField,默认会创建一个id的自增列 5 name = models.CharField(max_length=30) 6 email = models.EmailField() 7 memo = models.TextField() 更多字段: 1.models.AutoField

深入浅出MongoDB(六)java操作mongodb增删改查

java操作mysql数据库的代码我们已经了如指掌了,增删改查,java对mongodb数据库也是类似的操作,先是数据库连接,再是进行操作. 首先我们进入进入admin数据库,然后建立自己的数据库testMongoDb,进入admin数据库后,就可以直接进入testMongoDb,因为用户可以进入系统的数据库,就是超级管理员,use testMongoDb后,为该数据库设置用户名和密码,db.addUser('root','root'),这样我们在程序中连该数据库,并实现增删改查,代码如下所示.