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 null
s 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.