khai thác cú pháp mã thông báo bất ngờ U JSON


294

Tôi gặp lỗi này "chưa phát hiện cú pháp mã thông báo bất ngờ U" khi tôi chạy trang của mình bằng chrome. Và trong firefox tôi nhận được, "JSON.parse: nhân vật bất ngờ". Tôi đang trả lại dữ liệu json từ tệp php và chuỗi json trả về là hợp lệ. Tôi đã kiểm tra nó với http://jsonlint.com/ . Bất kỳ trợ giúp sẽ được đánh giá cao, cảm ơn.

Đây là chuỗi JSON được trả về

[
    ["1","Pan Africa Market","\"1521 1st Ave, Seattle, WA\"","47.608941","-122.340145","restaurant"],
    ["2","The Melting Pot","14 Mercer St, Seattle, WA","47.624562","-122.356442","restaurant"],
    ["3","Ipanema Grill","1225 1st Ave, Seattle, WA","47.606366","-122.337656","restaurant"],
    ["4","Sake House","230 1st Ave, Seattle, WA","47.612825","-122.34567","bar"],
    ["5","Crab Pot","1301 Alaskan Way, Seattle, WA","47.605961","-122.34036","restaurant"],
    ["6","Mexican Kitchen","2234 2nd Ave, Seattle,WA","47.613975","-122.345467","bar"],
    ["7","Wingdome","1416 E Olive Way, Seattle, WA","47.617215","-122.326584","bar"],
    ["8","Piroshky Piroshky","1908 Pike pl, Seattle, WA","47.610127","-122.342838","restaurant"]
]

Bạn có thể đăng JSON không? Khi tôi gặp lỗi đó, thông thường sẽ có một chuỗi chưa kết thúc - điều đó cho thấy rằng nó nằm ở chữ 'U' trong JSON.
Kyle Burton

Có thể là một số vấn đề lạ với \"đầu ra.
Felix Kling

JSON phân tích tốt. Bạn nên cố gắng tìm ra những gì mã của bạn thực sự bị nghẹt thở.
nneonneo

Câu trả lời:


647

Lỗi đó thường được nhìn thấy khi giá trị được đưa ra JSON.parsethực sự undefined. Vì vậy, tôi sẽ kiểm tra mã đang cố phân tích cú pháp này - rất có thể bạn không phân tích chuỗi thực tế được hiển thị ở đây.


27
Nó cũng có thể "undefined"là một chuỗi thay vì theo nghĩa đen undefined. Tôi chỉ mất 30 phút để tìm ra điều đó.
ug_

13
@ ns47731 Điều đó thực sự giống nhau. Lý do tại sao một thực tế không xác định trở thành u, đó undefinedlà bị ép buộc thành một chuỗi (bởi vì một chuỗi là những gì JSON.parse mong đợi).
Sean Kinsey

10
Ugh, đã gửi một yêu cầu không đồng bộ và ngay lập tức cố gắng phân tích cú trả lại không xác định. Chán ghét bản thân mình, cảm ơn.
Chris Trudeau

7
Lỗi này cũng sẽ bị ném qua máng UTF-8 {"ở đầu chuỗi json
metamagikum 10/03/2015

1
Lỗi của tôi là Unexpected token N in JSON at position...và vấn đề là một doublegiá trị:NaN
Jaider

14

Tôi đã nhận được thông báo này trong khi xác nhận (trong dự án MVC). Đối với tôi, việc thêm phần tử ValidationMessageFor đã khắc phục sự cố.

Nói chính xác, dòng số 43 trong jquery.validate.unazedrusive.js đã gây ra sự cố:

  replace = $.parseJSON(container.attr("data-valmsg-replace")) !== false;

Điều này đã đưa tôi đi đúng hướng; trong trường hợp của tôi, tôi đã làm $("form :input").valid();để kích hoạt xác nhận. Nhưng rõ ràng là nó đã gặp lỗi trên một trường ẩn mà không có ValidationMessageFor. Đã sửa bằng cách thay đổi thành$("form :input:visible").valid();
Trax72

7

Tham số cho JSON.parse có thể không trả về gì (tức là giá trị được cung cấp cho JSON.parse là undefined )!

Nó đã xảy ra với tôi khi tôi đang phân tích mã độ rắn được biên dịch từ tệp xyz.sol.

import web3 from './web3';
import xyz from './build/xyz.json';

const i = new web3.eth.Contract(
  JSON.parse(xyz.interface),
  '0x99Fd6eFd4257645a34093E657f69150FEFf7CdF5'
);

export default i;

mà đã sai chính tả là

JSON.parse(xyz.intereface)

mà không được trả lại!


5

Trường hợp phổ biến nhất của lỗi này xảy ra là sử dụng mẫu đang tạo điều khiển sau đó thay đổi cách idvà / hoặc nameđang được tạo bởi mẫu 'mặc định' với một cái gì đó như

@Html.TextBoxFor(m => m, new {Name = ViewData["Name"], id = ViewData["UniqueId"]} )

và sau đó quên thay đổi ValidationMessageForthành

@Html.ValidationMessageFor(m => m, null, new { data_valmsg_for = ViewData["Name"] })    

Hy vọng điều này sẽ giúp bạn tiết kiệm thời gian.


3

Tôi đã gặp phải lỗi này khi tôi chạy một điều kiện tìm kiếm trên một JSONArray trong vòng lặp for. Vấn đề tôi gặp phải là kết quả của một trong các giá trị trong vòng lặp for trả về null. Do đó, khi tôi cố gắng truy cập vào một tài sản trên đó thì nó đã thất bại.

Vì vậy, nếu bạn đang làm bất cứ điều gì trong JSONA, nơi bạn không chắc chắn về nguồn dữ liệu và tính toàn vẹn của nó, tôi nghĩ rằng đó là một thói quen tốt để xử lý các trường hợp ngoại lệ không xác định và không xác định trong trường hợp này.

Tôi đã sửa nó bằng cách kiểm tra null trên giá trị tìm kiếm được trả về trên JSONArray và xử lý các ngoại lệ một cách thích hợp.

Nghĩ rằng điều này có thể giúp đỡ.


1

Trong trường hợp của tôi, nó đã cố gắng gọi JSON.parse () trên một biến AJAX trước khi XHRResponse quay trở lại. VÍ DỤ:

var response = $.get(URL that returns a valid JSON string);
var data = JSON.parse(response.responseText);

Tôi đã thay thế nó bằng một ví dụ trong số trang jQuery với $ .get :

<script type="text/javascript"> 
    var jqxhr = $.get( "https://jira.atlassian.com/rest/api/2/project", function() {
          alert( "success" );
        })
          .done(function() {
//insert code to assign the projects from Jira to a div.
                jqxhr = jqxhr.responseJSON;
                console.log(jqxhr);
                var div = document.getElementById("products");
                for (i = 0; i < jqxhr.length; i++) {
                    console.log(jqxhr[i].name);
                    div.innerHTML += "<b>Product: " + jqxhr[i].name + "</b><BR/>Key: " + jqxhr[i].key + "<BR/>";
                }
                console.log(div);
            alert( "second success" );
          })
          .fail(function() {
            alert( "error" );
          })
          .always(function() {
            alert( "finished" );
          });

        // Perform other work here ...

        // Set another completion function for the request above
        jqxhr.always(function() {
          alert( "second finished" );
        });
</script>

1

Chỉ cần bạn không hiểu

ví dụ: điều đó có nghĩa là tôi có JSON CHUINGI .. KHÔNG ĐƯỢC YÊU CẦU ĐỐI TƯỢNG JSON HOẶC ARRAY.

Vì vậy, nếu trong javascript, bạn phân tích chuỗi như

var body={
  "id": 1,
  "deleted_at": null,
  "open_order": {
    "id": 16,
    "status": "open"}

var jsonBody = JSON.parse(body.open_order); //HERE THE ERROR NOW APPEARS BECAUSE THE STRING IS NOT A JSON OBJECT YET!!!! 
//TODO SO
var jsonBody=JSON.parse(body)//PASS THE BODY FIRST THEN LATER USE THE jsonBody to get the open_order

var OpenOrder=jsonBody.open_order;

Câu trả lời tuyệt vời ở trên


1

Câu trả lời này nếu dành cho những người đang gặp phải lỗi này khi làm việc với Tải lên tệp ..

Chúng tôi đã sử dụng phần mềm trung gian để mã hóa dựa trên mã thông báo - giải mã và chúng tôi đã gặp lỗi tương tự.

Sau đây là mã của chúng tôi trong tập tin tuyến đường:

  router.route("/uploadVideoMessage")
  .post(
    middleware.checkToken,
    upload.single("video_file"),
    videoMessageController.uploadVideoMessage
  );

Ở đây chúng tôi đã gọi phần mềm trung gian trước khi tải lên chức năng và điều đó gây ra lỗi. Vì vậy, khi chúng tôi thay đổi nó để làm việc này, nó đã làm việc.

router.route("/uploadVideoMessage")
  .post(
    upload.single("video_file"),
    middleware.checkToken,
    videoMessageController.uploadVideoMessage
  );

0

Đây không phải là một nhiệm vụ khó khăn. Vấn đề đó cũng xảy ra tại trang web của tôi, bạn nên thay đổi các tập tin js của bạn theo thứ tự hàng đầu. Bởi vì tại nơi bạn đang sử dụng Phân tích cú pháp JSON, lần này các tệp JS của bạn không được tải. THÍ DỤ #

<script type="text/javaScript">
...........SOME CODE.............
</script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>

thay đổi thành

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script type="text/javaScript">
...........SOME CODE.............
</script>

0

Chà, với tất cả những người thực sự không thể tìm thấy lỗi ở bất cứ đâu trong mã của bạn, không "không xác định như nó nói trong bộ nhớ cục bộ hay null" .. chỉ cần nhận xét mã của bạn và viết một mã khác thực sự loại bỏ mục trong bộ nhớ cục bộ. . sau đó, bạn có thể nhận xét hoặc xóa mã hiện tại và đặt lại mã trước đó bằng cách đơn giản bỏ qua nó (nếu bạn không xóa ... nếu bạn có thể viết lại :))

LocalStorage.setItem('Previous' , "removeprevious");  


LocalStorage.removeItem('Previous');   
 Console.log(LocalStorage.getItem('Previous'));

Bảng điều khiển sẽ hiển thị null và nó .. đặt lại mã của bạn nếu không hoạt động, anh bạn! Bạn đã gặp lỗi.

xin lỗi vì tiếng Anh của tôi!


-3

Tôi đã gặp lỗi này, khi tôi đang sử dụng cùng một biến cho chuỗi json và phân tích cú pháp json:

var json = '{"1":{"url":"somesite1","poster":"1.png","title":"site title"},"2":{"url":"somesite2","poster":"2.jpg","title":"site 2 title"}}'

function usingjson(){
    var json = JSON.parse(json);
}

Tôi đã thay đổi chức năng thành:

function usingjson(){
    var j = JSON.parse(json);
}

Bây giờ lỗi này đã biến mất.

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.