转:json的stringify方法作用

可使用JSON.parse(str)将其转化为json对象

 

作用:这个函数的作用主要是为了系列化对象的。 
可能有些人对系列化这个词过敏,我的理解很简单。就是说把原来是对象的类型转换成字符串类型(或者更确切的说是json类型的)。就这么简单。打个比方说,你有一个类,那么你可以通过这个方法转换成相应的json类型的。很简单吧。 
接着看。 
语法: 
JSON.stringify(value [, replacer] [, space]) 
value:是必须要的字段。就是你输入的对象,比如数组啊,类啊等等。 
replacer:这个是可选的。它又分为2种方式,一种是方法,第二种是数组。 
情况一:我们先说数据,通过我们后面的实验可以知道,它是和第一个有关系的。一般来说,我们系列化后的结果是通过键值对来进行表示的。 
比如说: 
name:"lan",age:25 
这种形式。 
所以,如果这种形式的话,如果第二个的值在第一个存在,那么的话就以第二个的值做key,第一个值为value进行表示,如果不存在,sorry,忽略。【是不是有点抽象,我也这么觉得,不过你等一下看实验 就OK了。。呼呼。】 
情况二:如果是方法,那很简单,就是说把系列化后的每一个对象(记住 是每一个)传进方法里面进行处理。 
space:很好理解,用什么来做分隔符的。 
1.如果省略的话,那么显示出来的值 就没有分隔符。直接输出来 
2.如果是一个数字的话,那么它就定义缩进几个字符,当然 如果大于10 ,则最大值为10. 
3.如果是一些转义字符,比如“\t”,表示回车,那么它每行一个回车。 
4.如果仅仅是字符串,OK,就在每行输出值的时候把这些字符串附加上去就OK。当然,最大长度也是10个字符。 
开始用实例说明; 
1.只有一个参数的情况下: 

复制代码代码如下:

var student = new Object(); 
student.name = "Lanny"; 
student.age = "25"; 
student.location = "China"; 
var json = JSON.stringify(student); 
alert(student); 


结果如下: 

有些人可能会怀疑JSON.stringify的作用,OK。那假如,我们不要这个函数。代码下面的样子: 

复制代码代码如下:

var student = new Object(); 
student.name = "Lanny"; 
student.age = "25"; 
student.location = "China"; 

// var json = JSON.stringify(student); 
alert(student); 


 恭喜你 得到的结果是: 

没骗你吧,继续。
2.第二个参数存在,并且第二个参数还是function的时候 

复制代码代码如下:

var students = new Array() ; 
students[0] = "Lanny"; 
students[1] = "dong"; 
students[2] = "I love you"; 
var json = JSON.stringify(students,switchUpper); 
function switchUpper(key, value) { 
return value.toString().toUpperCase(); 

alert(json); 

        //var json = JSON.stringify(students, function (key,value) { 

        //return value.toString().toUpperCase(); 

       //}); 


    上面的方法也可以换成下面的,2个都是一样,只是写法有那么一点点的不一样而已。 
 得到结果如下: 

 

3.第二个参数存在,并且第二个参数不是function,而是数组的时候。 
3.1 【误区】如果第一个参数是数组,第二个参数也是数组的话,只显示第一个参数的值。 
比如: 

复制代码代码如下:

var students = new Array() ; 
students[0] = "Lanny"; 
students[1] = "dong"; 
students[2] = "I love you"; 
var stu = new Array(); 
stu[0] = "1"; 
stu[1] = "2"; 
var json = JSON.stringify(students,stu); 
alert(json); 


 sorry 得到的结果就是: 

第二个被忽略了,只是第一个被系列化了。 

3.2 如果第一个是对象(这里说的对象就像在C#里面可以进行new的),第二个是数组的。 

那么如果第二个的value在第一个存在,那么的话就以第二个的值做key,第一个值为value进行表示 

复制代码代码如下:

var student = new Object(); 
student.qq = "5485891512"; 
student.name = "Lanny"; 
student.age = 25; 

var stu = new Array(); 
stu[0] = "qq"; 
stu[1] = "age"; 
stu[2] = "Hi";//这个student对象里不存在。 

var json = JSON.stringify(student,stu); 
alert(json); 


 得到的结果如下: 

因为stu[2] = "Hi";这个Hi 在第一个找不到,所以就不进行显示了。 

4.第三个参数 

4.1.如果省略的话,那么显示出来的值 就没有分隔符。直接输出来 

比如: 

复制代码代码如下:

var student = new Object(); 
student.qq = "5485891512"; 
student.name = "Lanny"; 
student.age = 25; 

var stu = new Array(); 
stu[0] = "qq"; 
stu[1] = "age"; 
stu[2] = "Hi"; 

var json = JSON.stringify(student,stu); 
alert(json); 


 输出的就是: 

4.2.如果是一个数字的话,那么它就定义缩进几个字符,当然 如果大于10 ,则最大值为10. 

复制代码代码如下:

var student = new Object(); 
student.qq = "5485891512"; 
student.name = "Lanny"; 
student.age = 25; 

var stu = new Array(); 
stu[0] = "qq"; 
stu[1] = "age"; 
stu[2] = "Hi"; 

var json = JSON.stringify(student,stu,100);//注意这里的100 
alert(json); 


那么得到的是: 

空开来了10个字符。 

4.3.如果是一些转义字符,比如“\t”,表示回车,那么它每行一个回车。 

也是一样。 

4.4.如果仅仅是字符串,OK,就在每行输出值的时候把这些字符串附加上去就OK。当然,最大长度也是10个字符。 

如果是var json = JSON.stringify(student,stu,“HaiKou”);//

 

<think>好的,我现在需要帮助用户正确使用JavaScript中的JSON.stringify方法。首先,我应该回顾一下这个方法的基本用法和常见问题。根据用户提供的引用内容,JSON.stringify用于将JavaScript对象换为JSON字符串,并且有一些注意事项,比如处理toJSON方法、无法序列化函数和正则表达式等。 用户可能想知道如何正确使用这个方法,包括参数配置、处理特殊对象以及避免常见错误。首先,我要确保覆盖基本用法,比如必需参数和可选参数。引用[2]提到可以传入replacer和space参数,这些可以用来过滤属性或美化输出。需要详细解释这些参数的用法,可能举例说明。 然后,处理包含toJSON方法的对象,引用[1]和[3]都说明了当对象有toJSON方法时,这个方法会被调用,并替代原对象的值。用户可能需要知道这个特性如何影响序列化结果,比如在示例中,对象被替换为字符串。这时候需要提醒用户注意检查对象是否包含自定义的toJSON方法,避免意外结果。 接下来是处理特殊数据类型,如函数、正则表达式、undefined等。根据引用[5],JSON.stringify无法正确处理函数和正则,序列化后它们会变成null或空对象。这时候需要告诉用户这些限制,并提供替代方案,比如在replacer函数中处理或使用其他深拷贝方法。 另外,循环引用的问题,用户可能在处理复杂对象时遇到。JSON.stringify无法处理循环引用,会导致错误。这时候需要建议用户使用工具库或者手动处理循环结构。 然后,格式化输出方面,space参数的使用可以让输出的JSON字符串更易读,比如缩进或添加空格。引用[2]中的示例可能没有具体展示,我需要举例说明如何用space参数美化输出。 还要提到JSON.parse和JSON.stringify配合使用进行深拷贝的局限性,如引用[5]提到的函数和正则的问题,以及可能的性能问题。用户可能想知道深拷贝的正确方法,这时候需要建议其他方法,比如递归拷贝或使用第三方库如lodash。 最后,总结常见问题,并生成相关的问题,帮助用户进一步学习。比如如何处理日期对象、自定义序列化顺序,或者性能优化等。确保覆盖用户可能遇到的各种情况,并引用提供的资料来支持回答。 现在需要组织这些内容,按照用户的要求,结构清晰,分步骤解释,正确使用LaTeX格式,确保每个部分都有对应的引用标注。同时,生成相关问题,帮助用户深入理解。</think>### 如何正确使用JavaScript的`JSON.stringify`方法? `JSON.stringify`是JavaScript中用于将对象换为JSON字符串的核心方法,但其使用涉及多个细节和注意事项。以下是分步说明: --- #### 1. **基本语法与参数** 方法签名: ```javascript JSON.stringify(value[, replacer[, space]]) ``` - **value**:必需,要换的JavaScript对象或值。 - **replacer**:可选,可以是函数或数组,用于筛选或换属性。 - **space**:可选,控制输出格式(缩进或空格)[^2]。 示例: ```javascript const obj = { name: "Alice", age: 25 }; console.log(JSON.stringify(obj)); // 输出: {"name":"Alice","age":25} ``` --- #### 2. **处理特殊数据类型** `JSON.stringify`无法序列化以下类型,会将其换为特定值: - **函数**:换为`null`。 - `undefined`:在对象属性中会被忽略,在数组中变为`null`。 - **正则表达式**:换为空对象`{}`[^5]。 示例: ```javascript const data = { func: () => {}, regex: /pattern/ }; console.log(JSON.stringify(data)); // 输出: {"regex":{}} ``` --- #### 3. **自定义序列化:`toJSON`方法** 若对象定义了`toJSON`方法,`JSON.stringify`会调用该方法并序列化其返回值[^1][^3]。 示例: ```javascript const obj = { date: new Date(), toJSON() { return this.date.toISOString(); } }; console.log(JSON.stringify(obj)); // 输出: "2023-10-01T00:00:00.000Z" ``` --- #### 4. **使用`replacer`参数** `replacer`可以是函数或数组,用于过滤或修改属性: - **数组**:仅序列化指定属性。 - **函数**:接收`key`和`value`,返回新值或`undefined`(跳过属性)。 示例(仅保留特定属性): ```javascript const user = { name: "Bob", age: 30, password: "123" }; const filtered = JSON.stringify(user, ["name", "age"]); console.log(filtered); // 输出: {"name":"Bob","age":30} ``` --- #### 5. **格式化输出:`space`参数** 通过`space`参数添加缩进或空格,提升可读性: ```javascript const obj = { a: 1, b: { c: 2 } }; console.log(JSON.stringify(obj, null, 2)); // 输出: // { // "a": 1, // "b": { // "c": 2 // } // } ``` --- #### 6. **处理循环引用** 若对象存在循环引用(如`obj.self = obj`),`JSON.stringify`会抛出错误。 解决方案:使用`replacer`函数跳过循环属性或使用库如`flatted`。 --- #### 7. **深拷贝的局限性** 虽然`JSON.parse(JSON.stringify(obj))`可实现简单深拷贝,但会丢失函数、正则等类型[^5]。替代方案: - 手动递归拷贝。 - 使用第三方库(如`lodash.cloneDeep`)。 --- ### 常见问题与解决 1. **日期对象序列化** 默认换为ISO字符串。可通过`toJSON`方法或`replacer`自定义格式。 2. **忽略`undefined`和`symbol`类型** 这些值在对象属性中会被忽略,在数组中变为`null`。 3. **性能优化** 避免频繁序列化大型对象,或使用`replacer`减少数据量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值