Cú pháp: Mã thông báo bất ngờ o trong JSON ở vị trí 1


138

Tôi phân tích một vài dữ liệu bằng cách sử dụng một lớp loại trong bộ điều khiển của mình Tôi đang nhận dữ liệu như sau:

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

Tôi đã cố lưu trữ dữ liệu như thế này

var userData = _data;
var newData = JSON.parse(userData).data.userList;

Làm thế nào tôi có thể trích xuất danh sách người dùng sang một biến mới?


11
Bạn có thể không cần sử dụng JSON.parse. Hãy thử sử dụng userDatatrực tiếp như một đối tượng.
Mohit Bhardwaj

13
Nếu console.log(typeof userData)hiển thị objectthì bạn đã có một đối tượng javascript và không phải là một chuỗi JSON mà bạn cần phân tích cú pháp.
t.niese

1
@MohitBhardwaj vâng, không cần thiết cho phân tích cú pháp ..
Soniya Mohan

5
Thông thường bất cứ khi nào bạn gặp lỗi này - Unexpected token o in JSON, rất có thể bạn đang cố phân tích một đối tượng đã ở dạng phân tích cú pháp.
Mohit Bhardwaj

@MohitBhardwaj được rồi!
Soniya Mohan

Câu trả lời:


188

JSON bạn đã đăng trông có vẻ ổn, tuy nhiên trong mã của bạn, rất có thể nó không phải là một chuỗi JSON nữa, mà đã là một đối tượng JavaScript. Điều này có nghĩa, không cần phân tích cú pháp nữa.

Bạn có thể tự kiểm tra điều này, ví dụ: trong bảng điều khiển của 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()chuyển đổi đầu vào thành một chuỗi. Các toString()phương pháp của JavaScript đối tượng bằng cách trở về mặc định [object Object], dẫn đến hành vi quan sát được.

Thay vào đó hãy thử các cách sau:

var newData = userData.data.userList;

1
Vì vậy, nó áp dụng cho tất cả các loại trình duyệt?
comeOnGetIt

@Timo Bạn có thể xem liên kết này.
V SH

Đôi khi lỗi này có thể xuất hiện khi điểm cuối url api phục vụ yêu cầu có lỗi trong mã của nó hoặc một số tệp được bao gồm hoặc sử dụng khác và nó đưa ra một lỗi không được xử lý hoặc ghi chú. Hầu hết bạn có thể có được điều này nếu bạn nhìn vào tab mạng trong các công cụ dành cho nhà phát triển Trình duyệt hoặc bạn có thể nhấn điểm cuối bằng cách sử dụng bài đăng và xem điều gì sẽ xuất hiện.
MuturiAlex

64

tham số đầu tiên của hàm JSON.parsephải là Chuỗi và dữ liệu của bạn là đối tượng JavaScript, vì vậy nó sẽ chuyển đổi thành Chuỗi [object object], bạn nên sử dụng JSON.stringifytrước khi truyền dữ liệu

JSON.parse(JSON.stringify(userData))

1
Tuyệt vời đã giúp bro. Cảm ơn :)
Anand_5050

Nó đã giúp. Cảm ơn cho giải pháp.
Nag Arjun

Bạn đã lưu bro ngày của tôi. Cảm ơn :)
Dwarkesh Soni

điều này sẽ không hoạt động khi chuỗi chứa một trích dẫn kép bạn có giải pháp nào không
Mr S Coder

21

Đừng bao giờ sử dụng JSON.parsemà không gói nó trong try-catchkhối:

// 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
Điều này không thực sự trả lời câu hỏi, nhưng ý kiến ​​về việc thiếu xử lý ngoại lệ.
Richard Duerr

1
@RichardDuerr, nhưng điều này sẽ giúp sửa lỗi chủ đề chính. tức là SyntaxError: Mã thông báo bất ngờ o trong JSON ở vị trí 1
Niko Jojo

6
Điều đó chỉ che giấu lỗi, nhưng không thực sự giải quyết nó.
Richard Duerr

21

Ngay phía trên JSON.parse, sử dụng:

var newData = JSON.stringify(userData)

4
JSON.stringify()chuyển đổi một đối tượng JavaScript thành một chuỗi đại diện của nó, điều này ngược lại với những gì JSON.parse()nó làm. Bạn đã nhận được SyntaxErrorbởi vì bạn đang cố phân tích một cái gì đó đã là một đối tượng. Trong giải pháp của @ Sukhchain, nó được chuyển đổi thành một chuỗi để tránh điều đó.
Hubert

1
Nhược điểm của nó là, cuối cùng bạn đang sử dụng JSON.parse()quá nhiều dư thừa. Mặc dù đó là một quá trình khá nhanh, việc phân tích JSON được thực hiện đồng bộ và có khả năng chặn UI của bạn, vì vậy tôi khuyên bạn không nên sử dụng nó. Thay vào đó, bạn có thể kiểm tra xem biến của bạn có phải là một đối tượng hay không, ví dụ như sử dụng typeof(userData) === 'object'trước khi thử phân tích nó.
Hubert

2

Chà, ý tôi là tôi cần phân tích đối tượng như thế này : var jsonObj = {"first name" : "fname"}. Nhưng, tôi thực sự không. Bởi vì nó đã là một JSON.


1

Lỗi 'O' bất ngờ được đưa ra khi dữ liệu JSON hoặc Chuỗi xảy ra để được phân tích cú pháp.

Nếu đó là chuỗi, nó đã được xâu chuỗi. Phân tích cú pháp kết thúc với lỗi 'O' không mong đợi.

Tôi đã đối mặt tương tự (mặc dù trong bối cảnh khác nhau), tôi đã giải quyết lỗi sau bằng cách xóa JSON Producer.

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

  }

Phản hồi chứa chuỗi trả về "OK" . Chú thích được đánh dấu là @ Sản phẩm ({** MediaType.APPLICATION_JSON }) ** cố phân tích chuỗi thành định dạng JSON dẫn đến kết quả là 'O' không mong đợi .

Xóa @ sản phẩm ({ MediaType.APPLICATION_JSON }) hoạt động tốt. Đầu ra: OK

Chú ý: Ngoài ra, về phía khách hàng, nếu bạn thực hiện yêu cầu ajax và sử dụng JSON.parse ("OK"), nó sẽ ném mã thông báo không mong đợi 'O'

O là chữ cái đầu tiên của chuỗi

JSON.parse (object) so sánh với jQuery.parseJSON (object);

JSON.parse ('{"name": "Yergalem", "thành phố": "Dover"}'); --- Hoạt động tốt


1

Chúng tôi cũng có thể thêm séc như thế này:

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

    return {};
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.