检查字符串是不是是 Typescript 中的有效 JSON

Posted

技术标签:

【中文标题】检查字符串是不是是 Typescript 中的有效 JSON【英文标题】:Check if a string is a valid JSON in Typescript检查字符串是否是 Typescript 中的有效 JSON 【发布时间】:2022-01-19 21:00:06 【问题描述】:

有很多关于如何在 javascript 中执行此操作的资料,但在 Typescript 中似乎并不那么简单。我想检查一个字符串是否是有效的 JSON,我尝试了以下代码:

function isJSON(str) 
    try 
        JSON.parse(str);
     catch (e) 
        return false;
    
    return true;

但无论我尝试什么字符串,它都不会抛出错误,即使是随机字符串,例如“[asc,22”

我也试过这个:

function testJSON(strJson) 
  try 
    const parsed = JSON.parse(strJson)
    if (parsed && typeof parsed === "object") 
      return true
    
   catch  return false 
  return false

但是在这种情况下,无论使用什么字符串,它都会返回 false,我不明白为什么,但是 JSON.parse() 函数总是返回一个字符串,无论我传递什么。

我希望函数有这样的结果:

"123" => false
"abc" => false
" "prop_1": "val_1", "prop_2": "val_2" " => true
" prop_1: "val_1", "prop_2": "val_2" " => false

编辑: 在在线平台 typescriptlang.org 上验证后,这在 Typescript 中有效,我不确定 ReactJS 是否有问题,我正在使用的文件类型为 .tsx

编辑 2: 这个问题原来与打字稿或反应无关,但代码在其他地方滥用了“JSON.stringify”方法,答案贴在下面。

【问题讨论】:

这能回答你的问题吗? How to test if a string is JSON or not? 您的第一个函数运行良好。你所期待的究竟是什么? “但无论我尝试什么字符串,它都不会抛出错误” 它会抛出什么错误?如果您单击“运行”按钮here,它似乎工作得很好。我所做的只是将: string 类型注释添加到您的参数中。 结果当我运行我在 typescriptlang.org 中提到的第二个函数时,它确实根据我的需要工作......但我不明白为什么它不在我的代码中运行,我现在注意到了我没有提到我正在使用 ReactJS 并且文件类型是 .tsx 而不是 .ts,我不知道这可能如何影响结果 【参考方案1】:

JSON.parse() 如果输入不正确,throw 会抛出异常,您只是在 catch 块中捕获它,通过运行下面的 sn-p 进行验证。

console.log(JSON.parse("sqdfq["));

【讨论】:

结果当我在 typescriptlang.org 中运行它时它确实可以工作,但我不明白为什么它没有在我的代码中运行,我使用的是 ReactJS 并且我的文件是一个 .tsx 文件。我将编辑我的问题,以防万一它有任何影响【参考方案2】:

你是对的,但是在这里展示一个好/坏的例子。

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://***.com/questions/70384627/check-if-a-string-is-a-valid-json-in-typescript#

【讨论】:

这在我的代码中不起作用,但我发现这在 Typescript 中不是问题并更新了我的问题,我不确定这是否是 React 和 tsx 文件类型的问题。当我在我的代码中尝试你的函数时,console.log(message.type) 返回未定义,我不知道为什么......【参考方案3】:

事实证明,我在问题中提到的第二个函数毕竟根据我的需要工作,发生的事情是在我的代码深处,作为字符串的输入在传递给方法之前再次被字符串化,这意味着当我解析它时,它总是返回一个字符串并且从不抛出错误。 我没有注意到 JSON.stringify 并且没有很好地理解它的行为,这很糟糕。

那么这个问题的正确答案就是问题中提到的:

function testJSON(strJson) 
  try 
    const parsed = JSON.parse(strJson)
    if (parsed && typeof parsed === "object") 
      return true
    
   catch  return false 
  return false

【讨论】:

以上是关于检查字符串是不是是 Typescript 中的有效 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何检查字符串文字类型是不是包含 TypeScript 中的值?

将 json 解析为 typescript 中的接口并检查是不是正常

如何检查字符串是不是是android中的有效电子邮件? [复制]

如何检查给定字符串是不是是Java中的有效JSON

java.io.File 中的空字符是不是对存在检查有效?

检查字符串是不是是有效的颜色表示