你知道JSON.stringify()的陷阱么?

2024-01-23 09:28
文章标签 json 陷阱 知道 stringify

本文主要是介绍你知道JSON.stringify()的陷阱么?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JS中JSON对象字符串化的细微差别

Javascript中JSON.stringify()是个强大的函数,可以把Javascript对象转换成JSON格式的字符串。

然而,它也有一些微妙的差别和潜在的陷阱,开发者需要注意以避免意外的行为。本文将探讨JSON.stringify()相关的各种缺陷。

1. 处理Undefined、Function和Symbol值:

一个显著的限制是undefinedFunctionSymbol值都是无效的JSON值。在转换过程中,如果在对象中遇到这些值,它们会被省略;如果在数组中遇到这些值,会被改成null。这可能导致意外的结果,比如函数被替换成null。

例子:

const obj = { foo: function() {}, bar: undefined, baz: Symbol('example') };  
const jsonString = JSON.stringify(obj);
console.log(jsonString); // 输出:'{"foo":null}'const obj2 = {arr: [function(){}]};  
console.log(JSON.stringify(obj2)); // 输出:{"arr":[null]}

2. Boolean、Number和String对象的原始值:

在字符串化过程中,Boolean、Number和String对象会被转换成对应的原始值。这与传统的转换语义一致。

例子:

const boolObj = new Boolean(true);
const jsonString = JSON.stringify(boolObj); 
console.log(jsonString); // 输出:'true'

3. 完全忽略Symbol键属性:

即使使用了替换函数,Symbol键属性在字符串化过程中也会被完全忽略。这意味着任何与Symbol键关联的数据都会从结果JSON字符串中排除。

例子:

const obj = { [Symbol('example')]: 'value' };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // 输出:'{}'const obj2 = {arr: [function(){}]}; 
console.log(JSON.stringify(obj2)); // 输出:'{}'

4. 处理Infinity、NaN和Null值:

Infinity、NaN和null值在字符串化过程中都被视为null

例子:

const obj = { value: Infinity, error: NaN, nothing: null };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // 输出:'{"value":null,"error":null,"nothing":null}'  

5. toJSON()方法责任:

如果一个对象有toJSON()方法,它负责定义序列化的数据。这允许对象进行自定义序列化逻辑。

例子:

const obj = {data: 'important information',toJSON: function() {return { customKey: this.data };}, 
};
const jsonString = JSON.stringify(obj);
console.log(jsonString); // 输出:'{"customKey":"important information"}'

6. 日期对象被视为字符串:

Date实例实现了toJSON()函数,返回一个字符串(与date.toISOString()相同),在字符串化过程中它们会被视为字符串。

例子:

const dateObj = new Date();
const jsonString = JSON.stringify(dateObj);
console.log(jsonString); // 输出:'"2023–12–06T12:34:56.789Z"'  

7. 循环引用异常:

如果JSON.stringify()遇到循环引用的对象,它会抛出错误。当一个对象引用自身形成一个循环时,就会产生循环引用。

例子:

const circularObj = { self: null };  
circularObj.self = circularObj;
JSON.stringify(circularObj); // 抛出错误  

8. 可枚举属性的序列化:

对于Map、Set、WeakMap和WeakSet等Object实例,只有它们的可枚举属性会被序列化。不可枚举的属性会被排除。

例子:

const mapObj = new Map([['key', 'value']]);
const jsonString = JSON.stringify(mapObj);  
console.log(jsonString); // 输出:'{}'

9. BigInt转换错误:

尝试使用JSON.stringify()转换BigInt类型的值会抛出错误。

例子:

const bigIntValue = BigInt(42);
JSON.stringify(bigIntValue); // 抛出错误

结论:

理解JSON.stringify()的微妙差别是防止JavaScript代码中出现意外问题的关键。通过意识到这些陷阱,开发者可以更有效地使用这个函数,并避免项目中的常见陷阱。

这篇关于你知道JSON.stringify()的陷阱么?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/635951

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制