Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

node.js - Is there any proper way to parse JSON with large numbers? (long, bigint, int64)

When I parse this little piece of JSON:

{ "value" : 9223372036854775807 } 

This is what I get:

{ hello: 9223372036854776000 }  

Is there any way to parse it properly?

like image 321
tartakynov Avatar asked Sep 12 '13 03:09

tartakynov


People also ask

How do I parse a large JSON file in node JS?

To parse large JSON file in Node. js, we call fs. createReadStream and use the JSONStream library. const fs = require("fs"); const JSONStream = require("JSONStream"); const getStream = () => { const jsonData = "myData.

Is there a limit to JSON Stringify?

So as it stands, a single node process can keep no more than 1.9 GB of JavaScript code, objects, strings, etc combined. That means the maximum length of a string is under 1.9 GB. You can get around this by using Buffer s, which store data outside of the V8 heap (but still in your process's heap).

What is Jsonpath parse?

JSON parsing is the process of converting a JSON object in text format to a Javascript object that can be used inside a program. In Javascript, the standard way to do this is by using the method JSON.


2 Answers

Not with built-in JSON.parse. You'll need to parse it manually and treat values as string (if you want to do arithmetics with them there is bignumber.js) You can use Douglas Crockford JSON.js library as a base for your parser.

EDIT2 ( 7 years after original answer ) - it might soon be possible to solve this using standard JSON api. Have a look at this TC39 proposal to add access to source string to a reviver function - https://github.com/tc39/proposal-json-parse-with-source

EDIT1: I created a package for you :)

var JSONbig = require('json-bigint');  var json = '{ "value" : 9223372036854775807, "v2": 123 }'; console.log('Input:', json); console.log('');  console.log('node.js bult-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('JSON.parse(input).value : ', r1.value.toString()); console.log('JSON.stringify(JSON.parse(input)):', JSONbig.stringify(r1)); 

Output:

Input: { "value" : 9223372036854775807, "v2": 123 }  node.js bult-in JSON: JSON.parse(input).value :  9223372036854776000 JSON.stringify(JSON.parse(input)): {"value":9223372036854776000,"v2":123}   big number JSON: JSON.parse(input).value :  9223372036854775807 JSON.stringify(JSON.parse(input)): {"value":9223372036854775807,"v2":123} 
like image 114
Andrey Sidorov Avatar answered Sep 22 '22 04:09

Andrey Sidorov


After searching something more clean - and finding only libs like jsonbigint, I just wrote my own solution. Is not the best, but it solves my problem. For those that are using Axios you can use it on transformResponse callback (this was my original problem - Axios parses the JSON and all bigInts cames wrong),

const jsonStr = `{"myBigInt":6028792033986383748, "someStr":"hello guys", "someNumber":123}` const result = JSON.parse(jsonStr, (key, value) => {  if (typeof value === 'number' && !Number.isSafeInteger(value)) {      let strBig = jsonStr.match(new RegExp(`(?:"${key}":)(.*?)(?:,)`))[1] // get the original value using regex expression       return strBig //should be BigInt(strBig) - BigInt function is not working in this snippet  }  return value    })    console.log({    "original": JSON.parse(jsonStr),    "handled": result    })
like image 38
Graps Avatar answered Sep 21 '22 04:09

Graps