【问题标题】:Getting issue while checking the content is json type using Javascript [duplicate]使用Javascript检查内容时出现问题是json类型[重复]
【发布时间】:2021-05-26 13:46:00
【问题描述】:

我正在检查输入值是 json 类型还是不使用 JavaScript,但对于某些特定值它失败了。我在下面解释我的代码。

isJSON = async(str) => {
  try {
    return (JSON.parse(str) && !!str);
  } catch (e) {
    return false;
  }
}

var testJSON = '{"name": "foo"}'
var number = 22
console.log("result is : ", isJSON(testJSON))
console.log("result is : ", isJSON(number))

这里str 包含输入值,此方法检查值是否为json 类型。但是如果输入值是任何数字,即str=22,那么它也返回true。这里我只需要检查输入值是否为json 类型值。请帮我解决问题。

【问题讨论】:

  • 为什么要异步? ....
  • 请更新您的问题,使其在内部保持一致,因为 '22' 是有效的 JSON。这意味着修复标题,也许“但如果输入值是任何数字,即 str=22,那么它也返回 true。”也许给我们一些示例输入和匹配输出,这样我们就不必猜测您想要什么。

标签: javascript json


【解决方案1】:

JSON.parse 会将值强制转换为字符串。

因此,您需要做的唯一其他检查是测试该值是否为字符串。

if (typeof str !== "string") return false;

字符串 "22" 是有效的 JSON 文本。


如果您想检查该值不仅是 JSON,而且是非数组对象的 JSON 表示。然后你需要明确地测试它。

isObjectAsJSON = (str) => {
  if (typeof str !== "string") return false;
  try {
    const parsed = JSON.parse(str);
    if (typeof parsed !== "object") return false;
    if (Array.isArray(parsed)) return false;
    return true;
  } catch (e) {
    return false;
  }
};

const values = {
  number: 22,
  json_number: JSON.stringify(22),
  json_array: JSON.stringify(["foo", "bar"]),
  json_object: JSON.stringify({
    foo: "bar"
  }),
};

Object.entries(values).forEach(([key, value]) => {
  console.log(key, isObjectAsJSON(value))
});

【讨论】:

  • typeof JSON.parse('22') == 'number'
  • @AllanWind — 是的。 JSON 文本 22 是数字的 JSON 表示形式。如果将其解析为 JSON,则会得到一个数字。
  • 您说“字符串“22”是有效的 JSON 文本。”但我想说的是,而不是文本使用数字或输入。
  • @AllanWind — 我完全不知道这个建议与我正在回答的问题有什么关系。
  • @Quentin,你的回答很好,但输入失败'{ "operation":"GET", "uri":"/asds/sadas", "headers":[{"key":"Accept","value":"application/json" }]}'
【解决方案2】:

22 的字符串是有效的 json(json 是一个元素,元素是一个 ws 值 ws,value 可以是一个数字)每个 https://www.json.org/json-en.html

【讨论】:

  • 不知道为什么我的回答被否决了。 Op 似乎试图做一些不同于验证输入的事情。也许 op 期望一个不是被询问的对象。答案是使用typeof 检查结果以查看它是否是预期的类型,并使用 Array.isArray() 告诉对象或数组。
猜你喜欢
  • 2014-07-25
  • 2023-03-27
  • 2020-01-20
  • 2022-07-06
  • 1970-01-01
  • 2014-09-15
  • 2019-09-02
  • 2015-05-14
  • 1970-01-01
相关资源
最近更新 更多