JS中JSON序列化JSON.stringify的坑点和处理

这篇具有很好参考价值的文章主要介绍了JS中JSON序列化JSON.stringify的坑点和处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JSON.stringify的问题

在js中提到对象转JSON字符串,基本都会想到JSON.stringify这个方法,以及对应的解析方法JSON.parse方法,这个的转换也被不少人用于深拷贝的操作中。
但是随着这一对方法的使用,我们会发现它们存在的弊端,比如会丢失函数和undefined类型的内容,如下:JS中JSON序列化JSON.stringify的坑点和处理
这里边的丢失内容为undefined类型c和函数f,在查询了资料后发现JSON.stringify会丢失的内容有以下内容:

  • 使用JSON.Stringify 转换的数据中,如果包含 function,undefined,Symbol,这几种类型,不可枚举属性,JSON.Stringify序列化后,这个键值对会消失
  • 转换的数据中包含 NaN,Infinity 值(含-Infinity),JSON序列化后的结果会是null
  • 转换的数据中包含Date对象,JSON.Stringify序列化之后,会变成字符串
  • 转换的数据包含RegExp 引用类型序列化之后会变成空对象
  • 无法序列化不可枚举属性。
  • 无法序列化对象的循环引用,(例如: obj[key] = obj)。
  • 无法序列化对象的原型链。

这样看来JSON.stringify简单好用,但是在使用上就要避免以上的问题了

JSON.stringify问题解决

在小编的工作中遇到较多的是函数丢失问题,因此在自己的项目会对JSON.stringify进行进一步的改造,也是基于JSON.stringigy提供的方式来的,使用起来没有什么差别,如下:

// 对象序列化,undefined和函数丢失问题
const JSONStringify = (option) => {
  return JSON.stringify(option,
    (key, val) => {
      // 处理函数丢失问题
      if (typeof val === 'function') {
        return `${val}`;
      }
      // 处理undefined丢失问题
      if (typeof val === 'undefined') {
        return 'undefined';
      }
      return val;
    },
    2
  )
}
// 对象序列化解析
const JSONParse = (objStr) => {
  return JSON.parse(objStr, (k, v) => {
    if (typeof v === 'string' && v.indexOf && v.indexOf('function') > -1) {
      // eval 可能在eslint中报错,需要加入下行注释
      // eslint-disable-next-line
      return eval(`(function(){return ${v}})()`);
    }
    return v;
  });
}

const obj = {
  a: null,
  b: 1,
  c: undefined,
  d: 'aaaa',
  e: true,
  f () {
    console.log('内容');
  }
}
// 序列化处理
const JSONStr = JSONStringify(obj);
console.log('序列化处理', JSONStr);
// 序列化解析
const JSONObj = JSONParse(JSONStr);
console.log('解析序列化内容', JSONObj);

// 深拷贝使用
const obj2 = JSONParse(JSONStringify(obj));
console.log('当前obj内容: ', obj);

上边内容输出的结果为:
JS中JSON序列化JSON.stringify的坑点和处理
这样简单改造后就支持了携带函数和undefined进行转换了,其它的问题也可以用相似的问题处理,这里就不一一介绍了

JSON.stringify深拷贝

对于深拷贝比较通俗的讲法就是将一个变量赋值给另一个变量,修改时候互不影响。
在js中最简单的方式就是JSON.stringify的方式了,但是处于上边描述的问题,很多人就采用了其它方式了比如函数递归等方式了,不过使用上边对JSON.stringify​封装的方式就可以了。
对于深拷贝这里只是一笔带过,如有疑问可以到技术群进行交流,文章底部有入群方式。


以上就是本文全部内容,如对你有帮助欢迎点赞留言
如有疑问可以留言,也可以到QQ群一起探讨:
QQ群1: 657011407, QQ群2: 492593055,也可以到微信找我 shenzhipeng1023(如要加微信群告诉小编即可)文章来源地址https://www.toymoban.com/news/detail-456962.html

到了这里,关于JS中JSON序列化JSON.stringify的坑点和处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • iOS处理json,序列化和反序列化

    Mantle 是一个开源的 Objective-C 框架,用于在 iOS 和 macOS 应用程序中实现模型层的序列化和反序列化。它提供了一种简单而强大的方式来将 JSON数据格式转换为自定义的数据模型对象,以及将数据模型对象转换为字典或 JSON 格式。 Mantle具有如下特点 自动映射 Mantle自动将 JSON 数据

    2024年02月11日
    浏览(11)
  • rust学习-json的序列化和反序列化

    由于 serde 库默认使用 JSON 格式进行序列化和反序列化 因此程序将使用 JSON 格式对数据进行序列化和反序列化 JSON:广泛使用的 JavaScript 对象符号,用于许多 HTTP API Postcard:no_std 和嵌入式系统友好的紧凑二进制格式。 CBOR:用于小消息大小且无需版本协商的简洁二进制对象表示

    2024年02月12日
    浏览(14)
  • 【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )

    【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )

    当谈到网络编程时,序列化和反序列化是非常重要的概念。在上一篇文章中,我们已经了解了在Linux环境下实现简单的TCP网络程序的基础知识。本文将继续探讨序列化和反序列化,这些概念对于在网络上传输数据以及跨网络通信至关重要。通过深入了解序列化和反序列化,我

    2024年04月08日
    浏览(17)
  • 【网络】协议的定制与Json序列化和反序列化

    【网络】协议的定制与Json序列化和反序列化

    我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层 建立链接和断开链接 基于TCP协议,我们需要知道写代码时对应的接口大概在TCP通讯的过程中属于什么样的时间点角色,在TCP协议时详谈。三次握手,四次挥手 listen状态:准备好了,可以进

    2024年02月09日
    浏览(11)
  • JSON序列化与反序列化NULL值丢失问题

    做项目一般都会有一些特殊的需求,例如保留json中的null值,但是fastjson都会把null值得属性给过滤掉 json序列化保留null值 json反序列化保留null值 使用hutool的Json工具时

    2024年02月15日
    浏览(26)
  • 使用nlohmann json库进行序列化与反序列化

    nlohmann源码仓库:https://github.com/nlohmann/json 使用方式:将其nlohmann文件夹加入,包含其头文件json.hpp即可 demo

    2024年02月10日
    浏览(12)
  • 【网络编程】协议定制+Json序列化与反序列化

    【网络编程】协议定制+Json序列化与反序列化

    需要云服务器等云产品来学习Linux的同学可以移步/--腾讯云--/--阿里云--/--华为云--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。   目录 一、序列化与反序列化的概念 二、自定义协议设计一个网络计算器 2.1TCP协议,如何保证接收方收到了完整的报文呢?

    2024年02月06日
    浏览(15)
  • Untiy Json和Xml的序列化和反序列化

    Untiy Json和Xml的序列化和反序列化

    Ps: Unity C# Json 序列化换行 效果: 引用:

    2024年02月13日
    浏览(13)
  • ASP.NET中JSON的序列化和反序列化

      JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间、集合、字典的处理。

    2024年02月15日
    浏览(9)
  • .NET的8种JSON序列化反序列化工具供你选择

    在.NET开发中,.NET的JSON序列化反序列化工具除了Newtonsoft.Json和System.Text.Json其实还有很多优秀的开源的序列化和反序列化工具,这些工具有的性能更加优秀,更加轻量等特征。本文将汇总介绍这些.NET中常用的JSON序列化和反序列化工具,供大家选择参考使用。 1、Newtonsoft.Json

    2024年02月08日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包