bigints支持JSON.parse/stringify解析方式。基于Douglas Crockford的JSON.js包和bignumber.js库。

本地Bigint最近被添加到JS中,所以我们增加了一个选项来代替bignumber.js。但是,使用本机BigInt进行解析是为了向后兼容

虽然大多数JSON解析器假设数值具有与IEEE 754 double相同的精度限制,但JSON规范对数字精度没有任何规定。任何十进制(可选科学)表示法中的浮点数都是有效的JSON值。在JSON api中,将可能不符合IEEE 754整数精度的值序列化为字符串是一个好主意,例如{“value”:9223372036854775807},仍然是一个有效的RFC4627 JSON字符串,在大多数JS运行时是JSON.parse是这个对象:{value: 9223372036854776000}
= = = = = = = = = =

example:

var JSONbig = require('json-bigint');

var json = '{ "value" : 9223372036854775807, "v2": 123 }';
console.log('Input:', json);
console.log('');

console.log('node.js built-in JSON:');
var r = JSON.parse(json);
console.log('JSON.parse(input).value : ', r.value.toString());
console.log('JSON.stringify(JSON.parse(input)):', JSON.stringify(r));

console.log('\n\nbig number JSON:');
var r1 = JSONbig.parse(json);
console.log('JSONbig.parse(input).value : ', r1.value.toString());
console.log('JSONbig.stringify(JSONbig.parse(input)):', JSONbig.stringify(r1));

Output:

Input: { "value" : 9223372036854775807, "v2": 123 }

node.js built-in JSON:
JSON.parse(input).value :  9223372036854776000
JSON.stringify(JSON.parse(input)): {"value":9223372036854776000,"v2":123}

big number JSON:
JSONbig.parse(input).value :  9223372036854775807
JSONbig.stringify(JSONbig.parse(input)): {"value":9223372036854775807,"v2":123}

Options

解析器的行为可以通过“Options”进行配置

options.strict, boolean值, 默认值:false

指定解析应 “strict” 报告已解析字符串中的重复键。默认值遵循标准json中允许的值,类似于json的行为解析,但是用分配给重复键的最后一个值覆盖前面的任何值。

设置options.strict = true 会在重复密钥出现时快速失效,并因此提前警告您可能丢失的信息。

example:

var JSONbig = require('json-bigint');
var JSONstrict = require('json-bigint')({ strict: true });

var dupkeys = '{ "dupkey": "value 1", "dupkey": "value 2"}';
console.log('\n\nDuplicate Key test with both lenient and strict JSON parsing');
console.log('Input:', dupkeys);
var works = JSONbig.parse(dupkeys);
console.log('JSON.parse(dupkeys).dupkey: %s', works.dupkey);
var fails = 'will stay like this';
try {
  fails = JSONstrict.parse(dupkeys);
  console.log('ERROR!! Should never get here');
} catch (e) {
  console.log(
    'Succesfully catched expected exception on duplicate keys: %j',
    e
  );
}

Output

Duplicate Key test with big number JSON
Input: { "dupkey": "value 1", "dupkey": "value 2"}
JSON.parse(dupkeys).dupkey: value 2
Succesfully catched expected exception on duplicate keys: {"name":"SyntaxError","message":"Duplicate key \"dupkey\"","at":33,"text":"{ \"dupkey\": \"value 1\", \"dupkey\": \"value 2\"}"}


options.storeAsString, boolean值, 默认值:false

指定BigInts是否应该以字符串的形式存储在对象中,而不是默认的BigNumber。

请注意,这是一种危险的行为,因为它破坏了在不更改数据类型的情况下来回转换的默认功能(因为这将把所有bigint转换为be-and-stay字符串)。

example:

var JSONbig = require('json-bigint');
var JSONbigString = require('json-bigint')({ storeAsString: true });
var key = '{ "key": 1234567890123456789 }';
console.log('\n\nStoring the BigInt as a string, instead of a BigNumber');
console.log('Input:', key);
var withInt = JSONbig.parse(key);
var withString = JSONbigString.parse(key);
console.log(
  'Default type: %s, With option type: %s',
  typeof withInt.key,
  typeof withString.key
);

Output

Storing the BigInt as a string, instead of a BigNumber
Input: { "key": 1234567890123456789 }
Default type: object, With option type: string


options.useNativeBigInt, boolean值, 默认值:false

指定解析器是否使用本机BigInt而不是bignumber.js

example:

var JSONbig = require('json-bigint');
var JSONbigNative = require('json-bigint')({ useNativeBigInt: true });
var key = '{ "key": 993143214321423154315154321 }';
console.log(`\n\nStoring the Number as native BigInt, instead of a BigNumber`);
console.log('Input:', key);
var normal = JSONbig.parse(key);
var nativeBigInt = JSONbigNative.parse(key);
console.log(
  'Default type: %s, With option type: %s',
  typeof normal.key,
  typeof nativeBigInt.key
);

Output

Storing the Number as native BigInt, instead of a BigNumber
Input: { "key": 993143214321423154315154321 }
Default type: object, With option type: bigint

options.alwaysParseAsBig, boolean值, 默认值:false

指定是否所有数字都应该存储为大数字。

请注意,这是一种危险的行为,因为它破坏了在不更改数据类型的情况下来回转换的默认功能(因为这将把所有数字转换为和保持BigNumber)

example:

var JSONbig = require('json-bigint');
var JSONbigAlways = require('json-bigint')({ alwaysParseAsBig: true });
var key = '{ "key": 123 }'; // there is no need for BigNumber by default, but we're forcing it
console.log(`\n\nStoring the Number as a BigNumber, instead of a Number`);
console.log('Input:', key);
var normal = JSONbig.parse(key);
var always = JSONbigAlways.parse(key);
console.log(
  'Default type: %s, With option type: %s',
  typeof normal.key,
  typeof always.key
);

Output

Storing the Number as a BigNumber, instead of a Number
Input: { "key": 123 }
Default type: number, With option type: object

如果您希望强制将所有数字解析为本地BigInt(您可能会这样做!)否则,任何计算都会成为真正的头痛):

var JSONbig = require('json-bigint')({
  alwaysParseAsBig: true,
  useNativeBigInt: true,
});

options.protoAction,boolean值,默认值:error,还可以设置为 “error”,“ignore”,“preserve”

options.constructorAction,boolean值,默认值:error,还可以设置为 “error”,“ignore”,“preserve”

控制__proto__和constructor 的性质如何处理。如果设置为“error”,则不允许使用,parse()调用将抛出一个错误。如果设置为“ignore”,则从解析和对象构建中跳过prroperty的值。如果设置为“preserve”,则设置__proto__属性。应该格外小心,确保使用其他库生成的数据不会受到原型中毒攻击的伤害。

example:

var JSONbigAlways = require('json-bigint')({ protoAction: 'ignore' });
const user = JSONbig.parse('{ "__proto__": { "admin": true }, "id": 12345 }');
// => result is { id: 12345 }

https://blog.csdn.net/qq_25434453/article/details/107877285](https://blog.csdn.net/qq_25434453/article/details/107877285),如有侵权,请联系删除。

posted on 2024-04-12 18:13  ygunoil  阅读(631)  评论(0编辑  收藏  举报