JSON.parse()和JSON.stringify()--json对象<=>字符串

本文介绍如何使用JavaScript解析JSON数据,包括使用JSON.parse和JSON.stringify函数,以及eval函数将JSON字符串转换为JavaScript对象的方法。示例展示了如何处理JSON数组和对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.parse 用于从一个字符串中解析出json 对象。例如

var str='{"name":"cpf","age":"23"}'

经 JSON.parse(str) 得到:

Object: age:"23"

            name:"cpf"

            _proto_:Object

ps:单引号写在{}外,每个属性都必须双引号,否则会抛出异常

 

2.stringify用于从一个对象解析出字符串,例如

var a={a:1,b:2}

经 JSON.stringify(a)得到:

“{“a”:1,"b":2}”

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>JS解析json数据(json字符串和数组之间相互转换)</TITLE>
<SCRIPT LANGUAGE="JavaScript">
var t="{'firstName': 'cyra', 'lastName': 'richardson', 'address': { 'streetAddress': '1 Microsoft way', 'city': 'Redmond', 'state': 'WA', 'postalCode': 98052 },'phoneNumbers': [ '425-777-7777','206-777-7777' ] }"; 
var jsonobj=eval('('+t+')');    //eval()函数:把json字符串转换为js对象。
alert(jsonobj.firstName); 
alert(jsonobj.lastName);
 
var t2="[{name:'zhangsan',age:'24'},{name:'lisi',age:'30'},{name:'wangwu',age:'16'},{name:'tianqi',age:'7'}] ";
var myobj=eval(t2);
for(var i=0;i<myobj.length;i++){
    alert(myobj[i].name);
    alert(myobj[i].age);
}
 
var t3="[['<a href=# onclick=openLink(14113295100,社旗县国税局桥头税务所,14113295100,d6d223892dc94f5bb501d4408a68333d,swjg_dm);>14113295100</a>','社旗县国税局桥头税务所','社旗县城郊乡长江路西段']]";
//通过eval() 函数可以将JSON字符串转化为对象
var obj = eval(t3);
for(var i=0;i<obj.length;i++){
    for(var j=0;j<obj[i].length;j++){
        alert(obj[i][j]);
    }
}
 
/*
//JSON.parse     函数的作用是将一个JSON 文本转换为 js对象。
//JSON.stringify 函数的作用跟 parse相反,用来将一个js对象转换为 JSON 文本。
var jsonText = JSON.stringify(obj); 
alert(jsonText);
//如果基于安全的考虑的话,最好是使用一个 JSON 解析器。 一个 JSON 解析器将只接受 JSON 文本。所以是更安全的。
var myObject = JSON.parse(myJSONtext, filter);   
//可选的 filter 参数将遍历每一个value key 值对, 并进行相关的处理。如:
myData = JSON.parse(text, function (key, value) {       
    return key.indexOf('date') >= 0 ? new Date(value) : value;
}); 
//stringify 函数的作用跟 parse 相反, 用来将一个js对象转换为 JSON 文本。
var myJSONText = JSON.stringify(myObject); 
*/
</SCRIPT>
</HEAD>
<BODY>
 
</BODY>
</HTML>

 

&lt;think>这段代码是一个简单的待办事项列表(或随机名字生成列表)应用,使用纯JavaScript实现,并利用localStorage进行数据持久化。主要功能包括: 1. 初始化时从localStorage中读取列表数据 2. 点击按钮生成一个随机中文名字并添加到列表中 3. 每个列表项旁边有一个删除按钮,点击可以删除该项 4. 列表数据会实时保存到localStorage中 但是,代码中存在几个问题需要修正: 1. `random` 函数:当前的随机数生成函数 `Math.floor(Math.random()*(max-min))+min` 实际上生成的是 `[min, max)` 的整数,而代码中期望的是闭区间 `[min, max]`。因此,在生成数组长度(2到5)Unicode码点(0x4e00到0x9fd6)时,需要包含最大值。应该修正为 `Math.floor(Math.random()*(max-min+1))+min` 才能包含max。 2. 初始化时,如果localStorage中没有`list`,使用空数组。但是代码使用了`JSON.parse(localStorage.list ?? "[]")`,当`localStorage.list`不存在时,`localStorage.list`为undefined,使用`??`操作符会取后面的值,即`"[]"`,这是正确的。但是,在第一次运行时,localStorage中没有list,所以解析空数组字符串没有问题。 下面我将逐行注释代码,并修正随机数函数的问题。 修正后的完整代码: ```javascript // 声明全局变量:bn(按钮元素),ul(列表元素),list(数据数组) var bn, ul, list; // 初始化函数 init(); function init() { // 从localStorage中获取list数据,如果不存在则初始化为空数组 // 使用??操作符,当localStorage.list为null或undefined时,使用"[]" list = JSON.parse(localStorage.list ?? "[]"); // 获取按钮ul元素 bn = document.querySelector("button"); ul = document.querySelector("ul"); // 绑定按钮点击事件处理函数 bn.addEventListener("click", clickHandler); // 绑定ul的点击事件处理函数(事件委托,处理删除按钮点击) ul.addEventListener("click", ulClickHandler); // 渲染列表 render(); } // 按钮点击事件处理函数 function clickHandler(e) { // 生成一个2到5之间的随机长度(包含25) let nameLength = random(2, 5); // 创建长度为nameLength的数组,填充1(填充什么不重要,后面会被覆盖) let nameArray = Array(nameLength).fill(1); // 将数组的每个元素替换为一个随机的中文字符 let name = nameArray.map(() => { // 生成一个在0x4e00到0x9fd6之间的随机Unicode码点(包含边界) let charCode = random(0x4e00, 0x9fd6); // 将Unicode码点转换为字符 return String.fromCharCode(charCode); }).join(""); // 将字符数组拼接成字符串 // 将新生成的名字对象(包含idname)添加到list数组 // 使用Date.now()作为id(时间戳,确保唯一性) list.push({ id: Date.now(), name }); // 将更新后的list数组转换为JSON字符串,保存到localStorage localStorage.list = JSON.stringify(list); // 重新渲染列表 render(); } // 渲染函数:将list数组渲染为列表项 function render() { // 使用map将每个列表项对象转换为HTML字符串 ul.innerHTML = list.map(item => { // 每个列表项是一个li元素,id为item.id,内部包含一个span显示名字一个删除按钮 return ` &lt;li id="${item.id}"> &lt;span>${item.name}&lt;/span> &lt;button>×&lt;/button> &lt;/li> `; }).join(""); // 将数组中的字符串元素连接成一个字符串 } // ul点击事件处理函数(事件委托) function ulClickHandler(e) { // 如果点击的不是button元素(使用正则匹配标签名,忽略大小写),则返回 if (!/button/i.test(e.target.nodeName)) return; // 获取被点击按钮的父元素(li)的id,并转换为数字 var id = Number(e.target.parentElement.id); // 过滤list,移除id匹配的项 list = list.filter(item => item.id !== id); // 将更新后的list保存到localStorage localStorage.list = JSON.stringify(list); // 重新渲染 render(); } // 生成[min, max]之间的随机整数(包含minmax) function random(min, max) { // 修正:使用(max - min + 1)来包含max return Math.floor(Math.random() * (max - min + 1)) + min; } ``` ### 代码说明: 1. **初始化**:从localStorage读取数据,初始化list数组,并绑定事件。 2. **添加项目**:点击按钮生成一个随机中文名字(2-5个字),以当前时间戳作为id,添加到list数组并保存到localStorage,然后重新渲染列表。 3. **删除项目**:通过事件委托,在ul上监听点击事件,当点击的是删除按钮(×)时,根据li元素的id删除对应的项,更新localStorage并重新渲染。 4. **渲染**:将list数组中的每个对象转换为li元素,设置id,并显示名字删除按钮。 5. **随机数函数**:修正后的random函数可以生成包含minmax的整数。 ### 注意事项: 1. 中文字符范围0x4e00到0x9fd6包含了非常用字,可能生成生僻字或不存在的字。可以根据需要调整范围(如0x4e00到0x9fa5)。 2. 使用Date.now()作为id在短时间内快速点击可能导致重复(虽然概率极低),但在高并发情况下建议使用更安全的唯一ID生成方式(如UUID)。 3. 事件委托用于处理动态生成的删除按钮,避免为每个按钮单独绑定事件。 ### 改进建议: - 在生成随机名字时,可以预先定义常见姓氏列表,使生成的姓名更真实。 - 添加输入框允许用户自定义名字。 §§相关问题§§: 1. 如何修改代码,使得生成的随机名字中包含常见姓氏? 2. 使用Date.now()作为唯一ID有什么潜在问题?如何生成更安全的唯一ID? 3. 如何优化事件委托的性能(特别是在列表项非常多的情况下)? 4. 这段代码在哪些浏览器中可能无法运行?如何解决兼容性问题?&lt;/think>以下是对您提供的 JavaScript 代码的逐行详细注释解释: ```javascript // 声明全局变量:bn(按钮元素),ul(列表元素),list(数据数组) var bn, ul, list; // 初始化函数 init(); function init() { // 从localStorage中获取list数据,如果不存在则初始化为空数组 // 使用??操作符,当localStorage.list为null或undefined时,使用"[]" list = JSON.parse(localStorage.list ?? "[]"); // 获取按钮ul元素 bn = document.querySelector("button"); ul = document.querySelector("ul"); // 绑定按钮点击事件处理函数 bn.addEventListener("click", clickHandler); // 绑定ul的点击事件处理函数(事件委托,处理删除按钮点击) ul.addEventListener("click", ulClickHandler); // 渲染列表 render(); } // 按钮点击事件处理函数 function clickHandler(e) { // 生成一个2到5之间的随机长度(包含25) let nameLength = random(2, 5); // 创建长度为nameLength的数组,填充1(填充什么不重要,后面会被覆盖) let nameArray = Array(nameLength).fill(1); // 将数组的每个元素替换为一个随机的中文字符 let name = nameArray.map(() => { // 生成一个在0x4e00到0x9fd6之间的随机Unicode码点 let charCode = random(0x4e00, 0x9fd6); // 将Unicode码点转换为字符 return String.fromCharCode(charCode); }).join(""); // 将字符数组拼接成字符串 // 将新生成的名字对象(包含idname)添加到list数组 // 使用Date.now()作为id(时间戳,确保唯一性) list.push({ id: Date.now(), name }); // 将更新后的list数组转换为JSON字符串,保存到localStorage localStorage.list = JSON.stringify(list); // 重新渲染列表 render(); } // 渲染函数:将list数组渲染为列表项 function render() { // 使用map将每个列表项对象转换为HTML字符串 ul.innerHTML = list.map(item => { // 每个列表项是一个li元素,id为item.id,内部包含一个span显示名字一个删除按钮 return ` &lt;li id="${item.id}"> &lt;span>${item.name}&lt;/span> &lt;button>×&lt;/button> &lt;/li> `; }).join(""); // 将数组中的字符串元素连接成一个字符串 } // ul点击事件处理函数(事件委托) function ulClickHandler(e) { // 如果点击的不是button元素(使用正则匹配标签名,忽略大小写),则返回 if (!/button/i.test(e.target.nodeName)) return; // 获取被点击按钮的父元素(li)的id,并转换为数字 var id = Number(e.target.parentElement.id); // 过滤list,移除id匹配的项 list = list.filter(item => item.id !== id); // 将更新后的list保存到localStorage localStorage.list = JSON.stringify(list); // 重新渲染 render(); } // 生成[min, max)范围内的随机整数 function random(min, max) { // Math.random()生成[0,1)的随机数 // (max - min)计算范围大小 // Math.floor向下取整确保结果为整数 return Math.floor(Math.random() * (max - min)) + min; } ``` ### 代码功能说明: 1. **数据结构**: - 使用数组`list`存储对象,每个对象包含`id`(时间戳)`name`(随机中文字符串- 数据通过`localStorage`持久化存储 2. **核心功能**: - **添加项目**:点击按钮生成随机中文名并添加到列表 - **删除项目**:点击×按钮删除对应项目 - **持久化**:所有操作后自动保存到localStorage - **渲染**:将数据数组转换为HTML列表 3. **关键技术点**: - **事件委托**:在父元素ul上监听点击事件,处理动态生成的子元素 - **数据持久化**:使用JSON序列化/反序列化存储复杂数据结构 - **随机中文生成**:通过Unicode码点范围生成中文字符 - **模板字符串**:使用反引号语法生成HTML内容 ### 改进建议: 1. **随机数函数修正**: 当前`random(min, max)`函数生成`[min, max)`的值,但代码期望的是`[min, max]`的闭区间: ```javascript function random(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } ``` 2. **XSS防护**: 当用户输入包含HTML特殊字符时,使用`innerHTML`可能导致XSS漏洞: ```javascript // 在render函数中: return ` &lt;li id="${item.id}"> &lt;span>${escapeHtml(item.name)}&lt;/span> &lt;button>×&lt;/button> &lt;/li> `; function escapeHtml(str) { return str.replace(/[&&lt;>"']/g, tag => ({ '&': '&', '&lt;': '&lt;', '>': '>', '"': '"', "'": ''' }[tag])); } ``` 3. **性能优化**: 频繁操作DOM时,使用文档片段(document fragment)减少重绘: ```javascript function render() { const fragment = document.createDocumentFragment(); list.forEach(item => { const li = document.createElement('li'); li.id = item.id; li.innerHTML = `&lt;span>${item.name}&lt;/span>&lt;button>×&lt;/button>`; fragment.appendChild(li); }); ul.innerHTML = ''; ul.appendChild(fragment); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值