【问题标题】:A solution for `Unexpected token a in JSON at position 0`“位置 0 处 JSON 中的意外标记 a”的解决方案
【发布时间】:2018-12-02 08:25:42
【问题描述】:

这是我经常遇到的常见错误之一。我想知道是否有解决方案。

let a = (str) => {
    try {
        return JSON.parse(str);
    } catch (e) {
        return e;
    }
}

a() 将字符串解析为 JSON 并返回。如果我们无法确定传递给 a() 的字符串始终是 JSON 可解析字符串怎么办。

例如:a("hello world");

这将导致

Unexpected token h in JSON at position 0

有没有一种聪明的方法可以将字符串解析为 JSON? (我的意思是,如果字符串不是可解析的,有没有办法返回字符串。)

【问题讨论】:

  • 这是个坏主意。如果不应该是 JSON 的东西碰巧看起来像 JSON,那么您的代码将严重中断(可能以涉及安全漏洞的方式)。你应该修正你的输入。
  • 是的,我同意。在某些情况下,比如我请求 API 并打印正文,如果正文应该是 JSON,但由于错误而不是。例如,它在我期望 JSON 的地方返回“无效令牌”。我认为在这种情况下,最好像 Marcos 所说的那样拥有isJSON() 功能。

标签: javascript json node.js string web


【解决方案1】:

如果字符串不是JSON,并且您希望返回该字符串,只需return

let a = (str) => {
    try {
        return JSON.parse(str);
    } catch (e) {
        // Instead of error, return str
        return str;
    }
}

JSON.parse 将抛出非 JSON 字符串。大多数JSON 验证器执行以下操作:

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

所以你的代码是完全有效的,你只需要返回错误的字符串,如果你期望非JSON字符串。

无论如何,如果您的函数需要一个 JSON,并且您收到一个非 JSON 字符串,那么您可能不应该返回相同的字符串。我会返回一个错误的值,或者只是让错误冒泡。

【讨论】:

  • 让函数返回不同类型是一种好习惯吗?比如,有时它返回一个 json object ,有时返回一个 string ?
  • 泷,实际上取决于。如果函数只是用来打印数据,我们还是要打印数据。
【解决方案2】:

正如 Marcos 所说,如果你想简单地返回字符串,那么在你的 catch 中返回输入参数。

但是,如果您想确保返回的数据类型始终一致,即始终返回 Map/JSON,而不是有时返回 String

您可以使用以下方式将字符串转换为键值映射对象:

let a = (str) => {
    try {
        return JSON.parse(str);
    } catch (e) {
        // Instead of error, return str as json object
        return {"value": str};
    }
}

然后您可以使用a.value 访问字符串

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 2021-12-21
    • 1970-01-01
    • 2021-02-20
    • 2020-07-02
    • 2018-11-25
    相关资源
    最近更新 更多