SyntaxError:JSON中位置1处的意外令牌o


138

我在控制器中使用类型类解析了一些数据,如下所示:

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

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


11
您可能不需要使用JSON.parse。尝试userData直接用作对象。
Mohit Bhardwaj

13
如果console.log(typeof userData)显示,object则您已经有一个javascript对象,而不是您需要解析的JSON字符串。
t.niese

1
@MohitBhardwaj是的,不需要解析
。–

5
通常,每当您收到此错误-时Unexpected token o in JSON,很可能您正试图解析已解析形式的对象。
Mohit Bhardwaj

@MohitBhardwaj好吧!
索尼娅·莫汉

Answers:


190

您发布的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;

1
那么,这适用于各种浏览器吗?
comeOnGetIt

@Timo您能否看一下此链接。
V SH

有时,当为请求提供服务的api URL端点的代码或其他包含或使用的文件中有错误,并且引发未处理或未记录的错误时,此错误就会浮出水面。通常,如果您查看浏览器开发人员工具中的“网络”选项卡,或者可以使用邮递员访问终结点并查看会发生什么,则可以获得此信息。
MuturiAlex

65

函数的第一个参数JSON.parse应该是String,并且您的数据是JavaScript对象,因此它将转换为String [object object],您应该JSON.stringify在传递数据之前使用

JSON.parse(JSON.stringify(userData))

1
伟大的帮助兄弟。谢谢:)
Anand_5050

它提供了帮助。感谢您的解决方案。
Nag Arjun

你救了我的兄弟。谢谢:)
矮人索尼

当字符串包含双引号你有任何解决方案,这将不起作用
先生小号编码器

23

不要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

7
这实际上并不能回答问题,而是对缺少异常处理的评论。
理查德·杜尔

2
@RichardDuerr,但这将有助于修复主题错误。即SyntaxError:JSON中位置1处出现意外令牌o
Niko Jojo,

6
那只是隐藏了错误,而没有真正解决它。
理查德·杜尔

21

在上方JSON.parse,使用:

var newData = JSON.stringify(userData)

4
JSON.stringify()将JavaScript对象转换为它的字符串表示形式,与之相反JSON.parse()SyntaxError之所以得到,是因为您试图解析已经是对象的东西。在@Sukhchain的解决方案中,它将转换为字符串来避免这种情况。
休伯特,

1
不利的一面是,最终您会JSON.parse()过多地使用冗余资源。尽管这是一个非常快速的过程,但解析JSON是同步完成的,并且可能会阻塞您的UI,因此建议您不要使用它。相反,您可以检查变量是否为对象,例如typeof(userData) === 'object'在尝试解析它之前使用。
休伯特,

2

好吧,我的意思是我需要像这样解析对象:var jsonObj = {"first name" : "fname"}。但是,我实际上不是。因为它已经是JSON。


2

我们还可以添加如下检查:

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

    return {};
}

1

解析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格式,从而导致意外的'O'

删除@Produces({ MediaType.APPLICATION_JSON })效果很好。输出:OK

当心:另外,在客户端,如果您发出ajax请求并使用JSON.parse(“ OK”),则会抛出意外的令牌'O'

O是字符串的第一个字母

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

JSON.parse('{“ name”:“ Yergalem”,“ city”:“ Dover”}'); - - 工作良好

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.