ไวยากรณ์ที่ไม่ได้ตรวจสอบโทเค็น U JSON ที่ไม่คาดคิด


294

ฉันได้รับข้อผิดพลาดนี้ "ไม่ได้ตรวจสอบไวยากรณ์โทเค็นที่ไม่คาดคิด U" เมื่อฉันเรียกใช้หน้าเว็บของฉันในโครเมี่ยม และใน firefox ฉันได้รับ "JSON.parse: ตัวละครที่ไม่คาดคิด" ฉันคืนข้อมูล json จากไฟล์ php และสตริง json ที่ส่งคืนนั้นถูกต้อง ฉันจะตรวจสอบกับhttp://jsonlint.com/ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม ... ขอบคุณ

นี่คือสตริง JSON ที่ส่งคืน

[
    ["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"]
]

คุณสามารถโพสต์ JSON ได้หรือไม่ เมื่อฉันได้รับข้อผิดพลาดนั้นโดยทั่วไปแล้ว manes ว่ามีสตริงที่ไม่สิ้นสุด - มันเป็นการระบุว่ามันเป็นตัวอักษร 'U' ใน JSON
Kyle Burton

อาจมีปัญหาบางอย่างกับ\"ในผลลัพธ์
เฟลิกซ์คลิง

JSON นั้นแยกวิเคราะห์ได้ดี คุณควรลองคิดดูว่าโค้ดของคุณสำลักจริงๆหรือไม่
nneonneo

คำตอบ:


647

ข้อผิดพลาดที่เห็นได้ตามปกติเมื่อค่าที่กำหนดให้เป็นจริงJSON.parse undefinedดังนั้นฉันจะตรวจสอบรหัสที่พยายามแยกนี้ - ส่วนใหญ่คุณจะไม่แยกสตริงที่เกิดขึ้นจริงที่แสดงที่นี่


27
นอกจากนี้ยังอาจจะเป็นสตริงแทนตัวอักษรที่"undefined" undefinedฉันใช้เวลา 30 นาทีเพื่อหาคำตอบ
ug_

13
@ ns47731 ที่จริงแล้วเหมือนกัน เหตุผลที่ไม่ได้กำหนดจริงกลายuเป็นว่าundefinedมีการข่มขู่ในสตริง (เพราะสตริงเป็นสิ่งที่ JSON.parse คาดหวัง)
Sean Kinsey

10
ฮึกำลังส่งคำขอแบบอะซิงโครนัสและพยายามแยกวิเคราะห์การส่งคืนที่ไม่ได้กำหนดทันที เบื่อหน่ายกับตัวเองขอบคุณ
Chris Trudeau

7
ข้อผิดพลาดนี้จะถูกโยนลงใน UTF-8 {"ที่จุดเริ่มต้นของสตริง json
metamagikum

1
ข้อผิดพลาดของฉันเป็นUnexpected token N in JSON at position...และปัญหาที่เกิดขึ้นเป็นความdoubleคุ้มค่า:NaN
Jaider

14

ฉันได้รับข้อความนี้ขณะตรวจสอบความถูกต้อง (ในโครงการ MVC) สำหรับฉันการเพิ่มValidationMessageองค์ประกอบสำหรับแก้ไขปัญหา

เพื่อให้แม่นยำหมายเลขบรรทัด 43 ใน jquery.validate.unobtrusive.js ทำให้เกิดปัญหา:

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

สิ่งนี้ทำให้ฉันไปถูกทาง; ในกรณีของฉันฉันกำลังทำ$("form :input").valid();เพื่อทริกเกอร์การตรวจสอบ แต่เห็นได้ชัดว่ามีข้อผิดพลาดในเขตข้อมูลที่ซ่อนอยู่โดยไม่มี ValidationMessageFor แก้ไขโดยการเปลี่ยนเป็น$("form :input:visible").valid();
Trax72

7

พารามิเตอร์สำหรับ JSON.parse อาจส่งคืนอะไรเลย (เช่นค่าที่กำหนดสำหรับ JSON.parse คือundefined)!

มันเกิดขึ้นกับฉันในขณะที่ฉันแยกวิเคราะห์รหัสการรวบรวมความแข็งจากไฟล์ 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;

ซึ่งสะกดผิดว่า

JSON.parse(xyz.intereface)

ซึ่งกลับมาไม่มีอะไร!


5

กรณีที่พบบ่อยที่สุดของข้อผิดพลาดนี้เกิดขึ้นคือการใช้แม่แบบที่สร้างตัวควบคุมจากนั้นเปลี่ยนวิธีidและ / หรือnameกำลังถูกสร้างขึ้นโดยแม่แบบเริ่มต้น 'แทนที่' กับสิ่งที่ชอบ

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

แล้วลืมเปลี่ยนValidationMessageForไป

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

หวังว่านี่จะช่วยคุณประหยัดเวลา


3

ฉันพบข้อผิดพลาดนี้เมื่อฉันรันเงื่อนไขการค้นหาบน JSONArray ภายในวง ปัญหาที่ฉันต้องเผชิญคือผลลัพธ์ของหนึ่งในค่าสำหรับลูปที่คืนค่าเป็นโมฆะ ดังนั้นเมื่อฉันพยายามเข้าถึงคุณสมบัติที่มันล้มเหลว

ดังนั้นหากคุณกำลังทำอะไรภายใน JSONArrays ที่คุณไม่แน่ใจว่าแหล่งข้อมูลและความสมบูรณ์ของมันฉันคิดว่ามันเป็นนิสัยที่ดีในการจัดการกับข้อยกเว้นโมฆะและไม่ได้กำหนดในกรณีนี้

ฉันแก้ไขมันโดยการตรวจสอบค่าว่างจากค่าส่งคืนของ find บน JSONArray และจัดการข้อยกเว้นอย่างเหมาะสม

คิดว่านี่อาจช่วยได้


1

ในกรณีของฉันมันพยายามเรียก JSON.parse () บนตัวแปร AJAX ก่อนที่ XHRResponse จะกลับมา เช่น:

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

ฉันแทนที่ด้วยตัวอย่างจากไซต์ jQuery สำหรับ $ .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

เพียงแค่ใส่ในกรณีที่คุณไม่เข้าใจ

เช่นเป็นที่ช่วยบอกว่าฉันมี JSON STRING .. ไม่เคยมีวัตถุ JSON หรือ ARRAY

ดังนั้นถ้าใน javascript คุณแยกสตริงเป็น

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;

คำตอบที่ดีข้างต้น


1

คำตอบนี้ถ้าสำหรับคนที่กำลังเผชิญกับข้อผิดพลาดนี้ในขณะที่ทำงานกับการอัปโหลดไฟล์ ..

เราใช้มิดเดิลแวร์สำหรับการเข้ารหัสตามโทเค็น - การถอดรหัสและเราพบข้อผิดพลาดเดียวกัน

ต่อไปนี้เป็นรหัสของเราในไฟล์เส้นทาง:

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

ที่นี่เราเรียกมิดเดิลแวร์ก่อนที่จะอัพโหลดฟังก์ชั่นและนั่นเป็นสาเหตุของข้อผิดพลาด ดังนั้นเมื่อเราเปลี่ยนเป็นสิ่งนี้มันทำงานได้

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

0

นี่ไม่ใช่งานยาก ปัญหานั้นก็เกิดขึ้นที่เว็บไซต์ของฉันคุณควรจะเปลี่ยนไฟล์ js ของคุณให้เป็นระเบียบ เนื่องจาก ณ สถานที่ที่คุณใช้การแยก JSON เวลานี้ไฟล์ JS ของคุณจะไม่ถูกโหลด ตัวอย่าง #

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

เปลี่ยนไป

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

0

สำหรับทุกคนที่ไม่สามารถหาข้อผิดพลาดได้ในทุกที่ในรหัสของคุณทั้ง "ไม่ได้กำหนดตามที่ระบุไว้ในที่จัดเก็บในท้องที่หรือค่า Null" .. เพียงแค่คอมเม้นท์รหัสของคุณและเขียนอีกอันหนึ่ง . หลังจากนั้นคุณสามารถแสดงความคิดเห็นหรือลบรหัสปัจจุบันและรีเซ็ตอีกครั้งก่อนหน้าโดยเพียงแค่ไม่ใส่เครื่องหมายความคิดเห็นออก (ถ้าคุณต้องการลบ t ... ถ้าคุณทำได้คุณสามารถเขียนได้อีก :))

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


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

คอนโซลจะแสดงเป็นโมฆะและตั้งค่ารหัสของคุณอีกครั้งหากไม่ทำงานเพื่อนคุณมีข้อผิดพลาด

ขอโทษสำหรับภาษาอังกฤษของฉัน!


-3

ฉันได้รับข้อผิดพลาดนี้เมื่อฉันใช้ตัวแปรเดียวกันสำหรับสตริง json และแจงวิเคราะห์ 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);
}

ฉันเปลี่ยนฟังก์ชั่นเป็น:

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

ข้อผิดพลาดนี้ก็หายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.