语法错误:JSON 中位置 1 的意外标记 o

IT技术 javascript angularjs json
2021-01-27 09:36:48

我正在使用控制器中的类型类解析一些数据。我得到的数据如下:

{  
   "data":{  
      "userList":[  
         {  
            "id":1,
            "name":"soni"
         }
      ]
   },
   "status":200,
   "config":{  
      "method":"POST",
      "transformRequest":[  
         null
      ],
      "transformResponse":[  
         null
      ],
      "url":"/home/main/module/userlist",
      "headers":{  
         "rt":"ajax",
         "Tenant":"Id:null",
         "Access-Handler":"Authorization:null",
         "Accept":"application/json, text/plain, */*"
      }
   },
   "statusText":"OK"
}

我试图像这样存储数据

var userData = _data;
var newData = JSON.parse(userData).data.userList;

如何将用户列表提取到新变量?

6个回答

您发布的 JSON 看起来不错,但是在您的代码中,它很可能不再是 JSON 字符串,而是已经是 JavaScript 对象。这意味着不再需要解析。

您可以自己测试,例如在 Chrome 的控制台中:

new Object().toString()
// "[object Object]"

JSON.parse(new Object())
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse("[object Object]")
// Uncaught SyntaxError: Unexpected token o in JSON at position 1

JSON.parse()将输入转换为字符串。toString()JavaScript 对象方法默认返回[object Object],导致观察到的行为。

请尝试以下操作:

var newData = userData.data.userList;
@Timo 你能看看这个链接吗?
2021-03-13 09:36:48
所以这适用于所有类型的浏览器?
2021-03-25 09:36:48
有时,当为请求提供服务的 api url 端点在其代码或其他一些包含或使用的文件中存在错误并且抛出未处理或未注意到的错误时,此错误可能会出现。大多数情况下,如果您查看浏览器开发人员工具中的网络选项卡,或者您可以使用邮递员点击端点并查看会出现什么情况,您就可以获得此信息。
2021-03-29 09:36:48
感谢您对 JSON String 与 JS Obj 区别的解释,当您知道为什么会发生时,更容易记住如何正确执行。
2021-04-11 09:36:48

JSON.parse函数的第一个参数应该是一个字符串,而你的数据是一个 JavaScript 对象,所以它会将它强制转换为 string "[object Object]"您应该JSON.stringify在传递数据之前使用

JSON.parse(JSON.stringify(userData))
可能不是 OP 中的示例 - 但有时对于某些库,您需要 JSON 结构而不是 JavaScript 结构。这有帮助。
2021-03-15 09:36:48
也许我遗漏了一些明显的东西,但是为什么要将对象转换为 JSON(这是这样JSON.stringify()做的),只是为了将 JSON 解析回对象?为什么不直接使用对象呢?这似乎完全是多余的。
2021-03-17 09:36:48
当字符串包含双引号时,这将不起作用您有任何解决方案吗
2021-04-05 09:36:48

不要JSON.parse在不将其包装在try-catch块中的情况下使用

// payload 
let userData = null;

try {
    // Parse a JSON
    userData = JSON.parse(payload); 
} catch (e) {
    // You can read e for more info
    // Let's assume the error is that we already have parsed the payload
    // So just return that
    userData = payload;
}

// Now userData is the parsed result
这只是隐藏了错误,但并没有真正解决它。
2021-03-31 09:36:48
@RichardDuerr,但这将有助于修复头部主题的错误。即 SyntaxError: Unexpected token o in JSON at position 1
2021-04-02 09:36:48
这实际上并没有回答这个问题,而是对缺乏异常处理的评论。
2021-04-11 09:36:48

就在上面JSON.parse,使用:

var newData = JSON.stringify(userData)
JSON.stringify()将 JavaScript 对象转换为它的字符串表示形式,这与它的作用相反JSON.parse()你得到的是SyntaxError因为你试图解析已经是一个对象的东西。在@Sukhchain 的解决方案中,它被转换为字符串以避免这种情况。
2021-03-28 09:36:48
这样做的缺点是,最终你使用了JSON.parse()过多的冗余。尽管这是一个非常快的过程,解析 JSON 是同步完成的,并且可能会阻塞您的 UI,所以我建议不要使用它。相反,您可以检查您的变量是否是一个对象,例如typeof(userData) === 'object'在尝试解析它之前使用
2021-04-02 09:36:48

我们还可以添加这样的检查:

function parseData(data) {
    if (!data) return {};
    if (typeof data === 'object') return data;
    if (typeof data === 'string') return JSON.parse(data);

    return {};
}