js中的bigint类型转化为json字符串时报无法序列化的问题

 更新时间:2024年01月23日 09:52:43   作者:panglinglong  
JSON序列化指将JSON对象转换为JSON字符串,J实现方式有两种:一种是调用JSON对象内置的stringify()函数,一种是为对象自定义toJSON()函数,本文重点介绍js中的bigint类型转化为json字符串时报无法序列化的问题,感兴趣的朋友一起看看吧

网上查了一下,解决这个问题的思路就是将bigint类型的数据转化为字符串,这样就能正确转化为json字符串了。对于一个是bigint的变量,直接使用toString方法就可以转化为字符串了,但是bigint变量在一个对象中,那么我们就需要一个更加通用的方法,网上看到一个很好的封装好的方法,如下。

export default function objReplacer(key, value) {
  if (typeof value === 'bigint') {
      return value.toString();
  } else if (typeof value === 'object') {
      for (const k in value) {
          if (typeof value[k] === 'bigint') {
              value[k] = value[k].toString();
          } else if (typeof value[k] === 'object') {
              value[k] = objReplacer(k, value[k]); // 递归处理嵌套对象
          }
      }
  }
  return value;
}
import objReplacer from "src/utils/bingintToString"
JSON.stringify(res,objReplacer)

扩展

JavaScript JSON序列化和反序列化

概述

JSON序列化指将JSON对象转换为JSON字符串。J实现方式有两种:一种是调用JSON对象内置的stringify()函数,一种是为对象自定义toJSON()函数。

JSON反序列化指将JSON字符串转换为JSON对象。实现方式有两种:一种是使用JSON对象内置的parse()函数,一种是使用eval()函数。

序列化

方式一:JSON.stringify()

语法

JSON.stringify(value, replacer, space)

说明

参数value:需要处理的值,可以为对象活数组。

参数replacer:可选参数。

  • 如果其值为一个函数,则表示在序列化过程中,被序列化值的每个属性都会经过该函数的处理;
  • 如果其值为一个数组,则表示只有包含在这个数组中的属性名才会被序列化到最终的JSON字符串中;
  • 如果该值为null或者未传递,则value参数对应值的所有属性都会被序列化。

参数space:可选参数。用于指定缩进用的空白字符串,美化输出。

  • 如果参数是个数字,则代表有多少个空格,上限值为10;
  • 如果该参数的值小于1,则意味着没有空格;
  • 如果参数为字符串,则取字符串的前十个字符作为空格;
  • 如果没有传入参数或者传入的值为null,将没有空格。
var obj = {
    name: "xiaoming",
    age: 18,
    sex: true,
    address: ["广东省", "广州市"]
};
var jsonStr = JSON.stringify(obj);
console.log(jsonStr); 
//{"name":"xiaoming","age":18,"sex":true,"address":["广东省","广州市"]}

使用2个参数

var obj = {
    name: "xiaoming",
    age: 18,
    sex: true,
    address: ["广东省", "广州市"]
};
function replacerFn(key, value) {
    if (typeof value === "string") {
        return value.toUpperCase();
    }
    return value;
}
var jsonStr = JSON.stringify(obj, replacerFn);
console.log(jsonStr);
//{"name":"XIAOMING","age":18,"sex":true,"address":["广东省","广州市"]}

var obj = {
    name: "xiaoming",
    age: 18,
    sex: true,
    address: ["广东省", "广州市"]
};
var jsonStr = JSON.stringify(obj, ["name", "age"]);
console.log(jsonStr);
//{"name":"xiaoming","age":18}

使用3个参数

var obj = {
    name: "xiaoming",
    age: 18,
    sex: true,
    address: ["广东省", "广州市"]
};
function replacerFn(key, value) {
    if (typeof value === "string") {
        return value.toUpperCase();
    }
    return value;
}
var jsonStr = JSON.stringify(obj, ["name", "age"], 10);
console.log(jsonStr);

var obj = {
    name: "xiaoming",
    age: 18,
    sex: true,
    address: ["广东省", "广州市"]
};
function replacerFn(key, value) {
    if (typeof value === "string") {
        return value.toUpperCase();
    }
    return value;
}
var jsonStr = JSON.stringify(obj, ["name", "age"], "@@@");
console.log(jsonStr);

在这里插入图片描述

其他

var jsonStr = JSON.stringify([new Number(1), new String("false"), new Boolean(false)]);
console.log(jsonStr); 
//[1,"false",false]
var jsonStr = JSON.stringify({
    x: undefined,
    y: Object,
    z: Symbol("")
});
console.log(jsonStr);
//{}
var jsonStr = JSON.stringify([undefined, Object, Symbol("")]);
console.log(jsonStr);
//[null,null,null]

方式二:自定义toJson

如果一个被序列化的对象拥有toJSON()函数,那么toJSON()函数就会覆盖默认的序列化行为,被序列化的值将不再是原来的属性值,而是toJSON()函数的返回值。

toJSON()函数用于更精确的控制序列化,可以看作是对stringify()函数的补充。

var obj = {
    name: "xiaoming",
    age: 18,
    sex: true,
    address: ["广东省", "广州市"],
    toJSON: function() {
        return {
            Name: this.name,
            Age: this.age,
            Sex: this.sex
        };
    }
};
var jsonStr = JSON.stringify(obj);
console.log(jsonStr);
//{"Name":"xiaoming","Age":18,"Sex":true}

序列化顺序

序列化处理的顺序如下:

  • 如果待序列化的对象存在toJSON()函数,则优先调用toJSON()函数,以toJSON()函数的返回值作为待序列化的值,否则返回JSON对象本身。
  • 如果stringify()函数提供了第二个参数replacer,则对上一步的返回值经过replacer参数处理。
  • 如果stringify()函数提供了第三个参数,则对JSON字符串进行格式化处理,返回最终的结果。

反序列化

方式一:JSON.parse()

语法

JSON.parse(text, reviver)

说明

参数text:待解析度JSON字符串。

参数reviver:可选参数。

  • 如果是一个函数,则规定了原始值在返回之前如何被解析改造。
  • 如果被解析的JSON字符串是非法的,则会抛出异常。

仅一个参数使用

var arrStr = '[1,true,"hello"]';
var arr = JSON.parse(arrStr);
console.log(arr); //[1, true, "hello"]
var objStr = `{
"name":"xiaoming",
"age":18,
"address":"beijing"
}`;
var obj = JSON.parse(objStr);
console.log(obj); //{name: "xiaoming", age: 18, address: "beijing"}
var a = "12.34";
var result = JSON.parse(a);
console.log(result); //12.34

使用2个参数

var objStr = `{
"name":"xiaoming",
"age":18,
"address":"beijing"
}`;
var result = JSON.parse(objStr, function(key, value) {
    if (key === "name") {
        return value + "先生";
    }
    if (key === "age") {
        return value + "岁";
    }
    return value;
});
console.log(result); //{name: "xiaoming先生", age: "18岁", address: "beijing"}

方式二eval()

eval()函数用于计算JavaScript字符串,并把它作为脚本来执行。

语法

eval("(" + str + ")")

说明

这里为什么要使用括号将拼接出来的字符串括起来呢?

因为JSON字符串是以“{}”表示开始和结束,在JavaScript中它会被当作一个语句块来处理,所以必须强制将它处理成一个表达式,所以采用括号。

使用

var objStr = `{
"name":"xiaoming",
"age":18,
"address":"beijing"
}`;
var result = eval("(" + objStr + ")");
console.log(result); //{name: "xiaoming先生", age: "18岁", address: "beijing"}

到此这篇关于js中的bigint类型转化为json字符串时报无法序列化的问题的文章就介绍到这了,更多相关js bigint类型转化json字符串报无法序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用JavaScript构建一个动态交互式图表

    使用JavaScript构建一个动态交互式图表

    在Web开发中,JavaScript不仅是实现交互效果的关键,还可以用于构建复杂的可视化组件,如动态交互式图表,下面我们就来看看如何构建一个动态交互式图表吧
    2024-02-02
  • JavaScript事件委托实现原理及优点进行

    JavaScript事件委托实现原理及优点进行

    这篇文章主要介绍了JavaScript事件委托实现原理及优点进行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 微信小程序使用onreachBottom实现页面触底加载及分页效果

    微信小程序使用onreachBottom实现页面触底加载及分页效果

    小程序还没有使用pc端的那种分页格式,下面这篇文章主要给大家介绍了关于微信小程序使用onreachBottom实现页面触底加载及分页效果的相关资料,需要的朋友可以参考下
    2022-10-10
  • js文件Cookie存取值示例代码

    js文件Cookie存取值示例代码

    这篇文章主要介绍了js文件Cookie存取值的使用,需要的朋友可以参考下
    2014-02-02
  • 基于javascript实现图片懒加载

    基于javascript实现图片懒加载

    这篇文章主要介绍了javascript实现图片懒加载的方法及思路,有时我们需要用懒加载,也就是延迟加载图片的方式,来提高网站的亲和力,需要的朋友可以参考下
    2016-01-01
  • 基于JavaScript代码实现pc与手机之间的跳转

    基于JavaScript代码实现pc与手机之间的跳转

    本文通过一段代码实例给大家介绍pc跳转手机代码,手机跳转pc网站代码的相关知识,对js跳转代码相关知识感兴趣的朋友一起通过本篇文章学习吧
    2015-12-12
  • 细说JavaScript中的this指向与绑定规则

    细说JavaScript中的this指向与绑定规则

    本文主要详细介绍了JavaScript中的this指向与绑定规则,默认绑定,隐式绑定,显示绑定,new绑定这四个规则,文中有相关的代码示例供大家参考,感兴趣的同学可以阅读下
    2023-05-05
  • js实现楼层效果的简单实例

    js实现楼层效果的简单实例

    下面小编就为大家带来一篇js实现楼层效果的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • js实现简单模态窗口,背景灰显

    js实现简单模态窗口,背景灰显

    昨天中午做项目需要一个模态窗口,想起上一个公司的项目经理曾经做过一个比较牛的模态窗口,至今没用搞清楚实现原理,平时也没有时间去分析,试着自己做了一个,用了一天的时间终于完成了,给大家一起分享, 也希望高手多提意见。第一次在博客园上发文章,挺高兴的。
    2008-11-11
  • JavaScript将取代AppleScript?

    JavaScript将取代AppleScript?

    这篇文章主要介绍了JavaScript将取代AppleScript?AppleScript是OS X平台的类似JavaScript的脚本语言,需要的朋友可以参考下
    2014-09-09

最新评论