我正在使用控制器中的类型类解析一些数据。我得到的数据如下:
{
"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 字符串。
Unexpected token o in JSON
时,很可能您正在尝试解析已经处于解析形式的对象。
您发布的 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.stringify()
所做的),只是为了将 JSON 解析回一个对象?为什么不直接使用对象?这似乎完全是多余的。
JSON.parse
,因为这会将 JSON 转换回 JS。
永远不要使用 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)
JSON.stringify()
将 JavaScript 对象转换为它的字符串表示形式,这与 JSON.parse()
的作用相反。您得到 SyntaxError
是因为您试图解析已经是对象的东西。在@Sukhchain 的解决方案中,它被转换为字符串以避免这种情况。
JSON.parse()
太多了。尽管这是一个非常快的过程,但解析 JSON 是同步完成的,并且可能会阻塞您的 UI,因此我建议您不要使用它。相反,您可以检查您的变量是否是一个对象,例如在尝试解析它之前使用 typeof(userData) === 'object'
。
我们还可以像这样添加检查:
function parseData(data) {
if (!data) return {};
if (typeof data === 'object') return data;
if (typeof data === 'string') return JSON.parse(data);
return {};
}
您可以简单地检查 typeof userData
& JSON.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
解析 JSON 数据或字符串时会引发意外的“O”错误。
如果它是字符串,它已经被字符串化了。解析以 Unexpected '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 格式,这会导致意外的“O”。
删除 @Produces({ MediaType.APPLICATION_JSON}) 工作正常。输出:好的
注意:另外,在客户端,如果您发出 ajax 请求并使用 JSON.parse("OK"),它会抛出 Unexpected token 'O'
O 是字符串的第一个字母
JSON.parse(object) 与 jQuery.parseJSON(object) 进行比较;
JSON.parse('{ "name":"Yergalem", "city":"Dover"}'); - - 工作正常
像这样尝试捕获,如果它的字符串化,这将解析它,否则将采用默认值
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));
}