javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > js bigint类型转化json字符串报无法序列化

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

作者: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:可选参数。

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

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}

序列化顺序

序列化处理的顺序如下:

反序列化

方式一:JSON.parse()

语法

JSON.parse(text, reviver)

说明

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

参数reviver:可选参数。

仅一个参数使用

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字符串报无法序列化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文