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

SyntaxError: Unexpected token o in JSON at position 1

本文关键字:意外 错误 JSON 位置 语法      更新时间:2023-09-26

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

{  
   "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看起来不错,但是在你的代码中,它很可能不再是一个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;

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

JSON.parse(JSON.stringify(userData))
如果不将其

包装在块中,请不要使用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

就在JSON.parse上方,使用:

var newData = JSON.stringify(userData)

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

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

您可以简单地检查typeof userData,只有在string时才JSON.parse()它:

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

当 JSON 数据或字符串碰巧被解析时,会引发意外的"O"错误。

如果是字符串,则它已经字符串化了。解析最终出现意外的"O"错误。

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

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

响应包含"确定"字符串返回。标记为 @Produces({ **MediaType.APPLICATION_JSON})** 的注释尝试将字符串解析为 JSON 格式,从而导致意外的"O"。

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

小心:此外,在客户端,如果您发出 ajax 请求并使用 JSON.parse("OK"),它会抛出意外的令牌"O"

O 是字符串的第一个字母

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

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

错误的原因是 Object 不是字符串的形式,它是{}的,它应该是字符串 Object( '{}'

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

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

在变量中首次设置请求值,如下所示:

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