SyntaxError:位置1的JSON中出现意外的标记o

Son*_*han 58 javascript json angularjs

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

{  
   "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"
}
Run Code Online (Sandbox Code Playgroud)

我试着像这样存储数据

var userData = _data;
var newData = JSON.parse(userData).data.userList;
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*imo 85

您发布的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
Run Code Online (Sandbox Code Playgroud)

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

请尝试以下方法:

var newData = userData.data.userList;
Run Code Online (Sandbox Code Playgroud)


小智 23

函数的第一个参数JSON.parse应该是一个String,而你的数据是一个JavaScript对象,所以它会转换为一个String [object object],你应该JSON.stringify在传递数据之前使用

JSON.parse(JSON.stringify(userData))
Run Code Online (Sandbox Code Playgroud)

  • 也许我遗漏了一些明显的东西,但为什么要将对象转换为 JSON(这就是 JSON.stringify() 的作用),只是将 JSON 解析回对象?为什么不直接使用对象呢?这看起来完全是多余的。 (8认同)
  • 当字符串包含双引号时这将不起作用你有什么解决方案 (3认同)

小智 16

就在上面JSON.parse,使用:

var newData = JSON.stringify(userData)
Run Code Online (Sandbox Code Playgroud)

  • `JSON.stringify()` 将 JavaScript 对象转换为它的字符串表示形式,这与 `JSON.parse()` 所做的相反。你得到 `SyntaxError` 因为你试图解析已经是一个对象的东西。在@Sukhchain 的解决方案中,它被转换为字符串以避免这种情况。 (9认同)

Pul*_*dha 13

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

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

    return {};
}
Run Code Online (Sandbox Code Playgroud)


Kou*_*sha 11

JSON.parse如果没有将其包裹在try-catch块中,请不要使用:

// payload 
let userData = null;

try {
    userDate = 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
Run Code Online (Sandbox Code Playgroud)

  • 这实际上并没有回答这个问题,而是对缺乏异常处理的评论. (5认同)
  • @RichardDuerr,但这将有助于修复头部主题的错误。即 SyntaxError: Unexpected token o in JSON at position 1 (3认同)
  • 那只是隐藏了错误,而没有真正解决它。 (3认同)

dea*_*904 6

您只需检查typeof userData& JSON.parse()it 仅当它是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
Run Code Online (Sandbox Code Playgroud)