How to parse JSON string containing “NaN” in Node.js

Have a node.js app that is receiving JSON data strings that contain the literal NaN, like

Then your NodeJS app isn’t receiving JSON, it’s receiving text that’s vaguely JSON-like. NaN is not a valid JSON token.

Three options:

1. Get the source to correctly produce JSON

This is obviously the preferred course. The data is not JSON, that should be fixed, which would fix your problem.

2. Tolerate the NaN in a simple-minded way:

You could replace it with null before parsing it, e.g.:

var result = JSON.parse(yourString.replace(/\bNaN\b/g, "null"));

…and then handle nulls in the result. But that’s very simple-minded, it doesn’t allow for the possibility that the characters NaN might appear in a string somewhere.

Alternately, spinning Matt Ball’s reviver idea (now deleted), you could change it to a special string (like "***NaN***") and then use a reviver to replace that with the real NaN:

var result = JSON.parse(yourString.replace(/\bNaN\b/g, '"***NaN***"'), function(key, value) {
    return value === "***NaN***" ? NaN : value;
});

…but that has the same issue of being a bit simple-minded, assuming the characters NaN never appear in an appropriate place.

3. Use (shudder!) eval

If you know and trust the source of this data and there’s NO possibility of it being tampered with in transit, then you could use eval to parse it instead of JSON.parse. Since eval allows full JavaScript syntax, including NaN, that works. Hopefully I made the caveat bold enough for people to understand that I would only recommend this in a very, very, very tiny percentage of situations. But again, remember eval allows arbitrary execution of code, so if there’s any possibility of the string having been tampered with, don’t use it.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)