There are many sources on how to do so in Javascript, but it seems it's not that simple in Typescript. I want to check if a string is a valid JSON, I have tried the following code:
function isJSON(str) {
try {
JSON.parse(str);
} catch (e) {
return false;
}
return true;
}
But no matter what string I try it does not throw an error, even a random string such as "[asc,22"
I have also tried this:
function testJSON(strJson) {
try {
const parsed = JSON.parse(strJson)
if (parsed && typeof parsed === "object") {
return true
}
} catch { return false }
return false
}
But in this case it returns false no matter what string is used, I am not understanding why but the JSON.parse() function always returns a string no matter what I pass it.
I want the function to have results like this:
"123" => false
"abc" => false
"{ "prop_1": "val_1", "prop_2": "val_2" }" => true
"{ prop_1: "val_1", "prop_2": "val_2" }" => false
EDIT: This DOES work in Typescript after verifying on the online platform typescriptlang.org, I am not sure if it might be a problem in ReactJS, the file I am working in is of type .tsx
EDIT 2: The issue turned out not to be related to typescript or react, but the code was misusing elsewhere the "JSON.stringify" method, answer was posted below.
CodePudding user response:
You were correct but to show a good/bad example here it goes.
let badJSON = `'""{bad bad}"'"`;
let goodJSON = `{"type":"pong"}`;
let CheckJSON = (Data) => {
try {
let message = JSON.parse(Data);
if (message.type == "pong") {
console.log("PING");
}
} catch (e) {
console.warn("close:");
}
};
CheckJSON(goodJSON);
CheckJSON(badJSON);
https://stackoverflow.com/questions/70384627/check-if-a-string-is-a-valid-json-in-typescript#
CodePudding user response:
JSON.parse()
does throw
an exception if the input is not correct, you are just catching it in the catch
block, verify by running the snippet below.
console.log(JSON.parse("sqdfq["));
CodePudding user response:
It turned out that the second function I mentioned in the question is working afterall according to what I needed, what was happening is that deep in my code the input that was a string was being stringified again before being passed to the method, that meant that when I was parsing it, it was always returning a string and never throwing an error. My bad for not noticing the JSON.stringify and not understanding its behavior well.
The correct answer to this question would then be as mentioned in the question:
function testJSON(strJson) {
try {
const parsed = JSON.parse(strJson)
if (parsed && typeof parsed === "object") {
return true
}
} catch { return false }
return false
}