【问题标题】:SyntaxError: Unexpected token o in JSON at position 1SyntaxError:位置 1 处 JSON 中的意外标记 o
【发布时间】:2021-08-28 04:47:54
【问题描述】:

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

{  
   "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;

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

【问题讨论】:

  • 您可能不需要使用JSON.parse。尝试将userData 直接用作对象。
  • 如果console.log(typeof userData) 显示object,那么您已经有一个javascript 对象,而不是您需要解析的JSON 字符串。
  • @MohitBhardwaj 是的,解析不需要..
  • 通常每当您收到此错误 - Unexpected token o in JSON,很可能您正在尝试解析已解析形式的对象。
  • @MohitBhardwaj 好吧!

标签: javascript angularjs json


【解决方案1】:

您发布的 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() 将输入转换为字符串。 JavaScript 对象的toString() 方法默认返回[object Object],导致观察到的行为。

请尝试以下方法:

var newData = userData.data.userList;

【讨论】:

  • 所以它适用于各种浏览器?
  • @Timo 你能看看这个链接吗?
  • 有时,当服务于请求的 api url 端点在其代码或其他包含或使用的文件中存在错误并且抛出未处理或未记录的错误时,此错误可能会出现。大多数情况下,如果您查看浏览器开发人员工具中的网络选项卡,您可以得到此信息,或者您可以使用 post man 访问端点,看看会发生什么。
  • 感谢您对 JSON String 与 JS Obj 区别的解释,当您知道它发生的原因时更容易记住如何正确操作。
  • 为我节省了几分钟,谢谢。我正在使用require。
【解决方案2】:

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

JSON.parse(JSON.stringify(userData))

【讨论】:

  • 当字符串包含双引号时这将不起作用您有什么解决方案
  • 也许我遗漏了一些明显的东西,但是你为什么要把一个对象变成 JSON(这是 JSON.stringify() 所做的),只是将 JSON 解析回一个对象?为什么不直接使用对象?这似乎完全是多余的。
  • 可能不是 OP 中的示例 - 但有时您需要 JSON 结构,而不是某些库的 JavaScript 结构。这有帮助。
  • 如果您需要 JSON,那么您不会使用JSON.parse,因为这会将 JSON 转换回 JS。
【解决方案3】:

永远不要使用 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

【讨论】:

  • 这实际上并没有回答问题,而是缺乏异常处理。
  • @RichardDuerr,但这将有助于修复头部主题的错误。即 SyntaxError: Unexpected token o in JSON at position 1
  • 这只是隐藏了错误,并没有真正解决它。
【解决方案4】:

就在JSON.parse上方,使用:

var newData = JSON.stringify(userData)

【讨论】:

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

我们也可以像这样添加检查:

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

    return {};
}

【讨论】:

    【解决方案6】:

    你可以简单地检查typeof userDataJSON.parse()它只有当它是string时:

    var userData = _data;
    var newData;
    if (typeof userData === 'object')
      newData = userData.data.userList; // dont parse if its object
    else if (typeof userData === 'string')
      newData = JSON.parse(userData).data.userList; // parse if its string
    

    【讨论】:

      【解决方案7】:

      在解析 JSON 数据或字符串时会抛出意外的“O”错误。

      如果是字符串,它已经被字符串化了。解析以意外的“O”错误结束。

      我遇到了类似的情况(尽管在不同的上下文中),我通过删除 JSON Producer 解决了以下错误。

          @POST
          @Produces({ **MediaType.APPLICATION_JSON**})
          public Response login(@QueryParam("agentID") String agentID , Officer aOffcr ) {
            return Response.status(200).entity("OK").build();
      
        }
      

      响应包含 "OK" 字符串返回。 标记为 @Produces({ **MediaType.APPLICATION_JSON})** 的注释尝试将字符串解析为 JSON 格式,这会导致 Unexpected 'O'

      删除 @Produces({ MediaType.APPLICATION_JSON}) 工作正常。 输出:OK

      注意: 此外,在客户端,如果您发出 ajax 请求并使用 JSON.parse("OK"),它会抛出 Unexpected token 'O'

      O是字符串的第一个字母

      JSON.parse(object) 与 jQuery.parseJSON(object) 比较;

      JSON.parse('{ "name":"Yergalem", "city":"Dover"}'); --- 工作正常

      【讨论】:

        【解决方案8】:

        像这样尝试捕获,如果它被字符串化,它将解析它,否则将采用默认值

        let example;
           try {
           example  = JSON.parse(data)
          } catch(e) {
            example = data
          }
        

        【讨论】:

          【解决方案9】:

          首先在变量中设置请求值,如:

          let reqData = req.body.reqData;
          if (reqData) {
            let reqDataValue = JSON.parse(JSON.stringify(reqData));
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-02-16
            • 1970-01-01
            • 2016-08-29
            • 2019-01-04
            相关资源
            最近更新 更多