Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON Not converting long numbers appropriately

I have a simple JSON where number is not getting parsed properly.

[
  {
    "orderNumber": 1,
    "customerId": 228930314431312345,
    "shoppingCartId": 22893031443137109,
    "firstName": "jjj"
  }
]

I tried it @ http://www.utilities-online.info/xmltojson/ and the result was

<?xml version="1.0" encoding="UTF-8" ?>
<orderNumber>1</orderNumber>
<customerId>228930314431312350</customerId>
<shoppingCartId>22893031443137108</shoppingCartId>
<firstName>jjj</firstName>

As you can see....the XML is different from JSON. I'm new to JSON. Am I missing something?

like image 635
Jeet Avatar asked Apr 07 '13 23:04

Jeet


People also ask

Does JSON support long?

As a practical matter, Javascript integers are limited to about 2^53 (there are no integers; just IEEE floats). But the JSON spec is quite clear that JSON numbers are unlimited size.

What is the limitation of JSON?

The current file size limit of a json file is 18,446,744,073,709,551,616 characters or if you prefer bytes, or even 2^64 bytes if you're looking at 64 bit infrastructures at least.

How do I know if JSON format is correct?

The simplest way to check if JSON is valid is to load the JSON into a JObject or JArray and then use the IsValid(JToken, JSchema) method with the JSON Schema.

Are numbers allowed in JSON?

JSON NumbersNumbers in JSON must be an integer or a floating point.


2 Answers

This is a Javascript precision problem.

According to Mozilla Developer Network:

ECMA-262 only requires a precision of up to 21 significant digits. Other implementations may not support precisions higher than required by the standard.

Source: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toPrecision

I pasted your array into Google Chrome's Javascript console and got back this: Javascript precision bug

So it looks like Javascript is rounding the values before they are being converted to XML. Since your conversion is being done via Javascript in the browser at http://www.utilities-online.info/xmltojson/, it makes sense why the number was changed.

(Note: I tested on Google Chrome version 26.0.1410.43 m using Windows 7 Professional)

Edit:

Is there any reason why you cannot pass these values to Javascript as strings?

Try this:

[
  {
    "orderNumber": "1",
    "customerId": "228930314431312345",
    "shoppingCartId": "22893031443137109",
    "firstName": "jjj"
  }
]

I was able to do this and save the values successfully. However, you will not be able to run a math calculation on them in Javascript without losing some precision, unless you are doing something like multiplying by 0, of course.

Javascript precision string workaround

This also converted to XML correctly using your reference http://www.utilities-online.info/xmltojson/.

like image 108
Aiias Avatar answered Nov 11 '22 14:11

Aiias


Javascript represents its numbers as double precision floats which limits the largest integer number that can be represented to +-9007199254740992. Here is the ECMA documentation.

like image 32
David Weber Avatar answered Nov 11 '22 15:11

David Weber