עזרה טכנית

למה JSON.parse אומר "Unexpected token"?

JSON.parse זורק Unexpected token כשהטקסט אינו JSON תקין. נפו מרכאות בודדות, פסיקים סוגרים, תשובות HTML ומיקום השגיאה.

תשובה מהירה

JSON.parse() זורק SyntaxError כשהקלט אינו JSON תקין. «Unexpected token» פירושו בדרך כלל שהמנתח הגיע לתו שאינו מותר באותה נקודה במבנה.

גורמים נפוצים כוללים מרכאות בודדות, פסיק סוגר, שמות מאפיין בלי מרכאות, בריחת מחרוזת שגויה, טקסט עודף סביב ה-JSON, או ניתוח HTML או גוף שאינו JSON כאילו היה JSON.

ניסוח השגיאה המדויק משתנה לפי מנוע JavaScript ודפדפן. אל תניחו שכל סביבת ריצה מדפיסה «Unexpected token X in JSON at position N».

זה אבחון Unexpected token ב-JSON.parse: מה השגיאה אומרת, איך לקרוא את המיקום, ומה לעשות כשהגוף הוא HTML. כיסוי רחב יותר לפסיק סוגר, מרכאות ו-Unexpected end נמצא ב-שגיאות JSON נפוצות: פסיק סופי, מרכאות ו-Unexpected token.

מה פירוש “Unexpected token” ב-JSON.parse()?

JSON.parse() דורש דקדוק JSON. תו לא חוקי במיקום הנוכחי זורק SyntaxError. {“name”:“Alex”,} אינו תקין: אחרי הפסיק ההוא האובייקט אינו יכול להסתיים. טקסט ההודעה והמיקום עדיין משתנים לפי סביבת הריצה.

איזו שגיאה JSON.parse() זורק?

JSON לא תקין בדרך כלל זורק SyntaxError. רשמו error.name כדי לאשר את הסוג. אל תקבעו בקוד את error.message המלא: מנועים וגרסאות מנסחים אותו אחרת.

try {
  JSON.parse('{"name":"Alex",}');
} catch (error) {
  console.log(error.name);
  // SyntaxError
}

1. שימוש במרכאות בודדות במקום כפולות

{‘name’:‘Alex’} אינו JSON תקין. {“name”:“Alex”} תקין. מחרוזות JSON ושמות חברי אובייקט משתמשים במרכאות כפולות. ליטרל אובייקט JavaScript כמו const user = { name: ‘Alex’ } יכול להיות JavaScript חוקי ועדיין לא טקסט JSON.

לא תקין

{'name':'Alex'}

תקין

{"name":"Alex"}

2. פסיק סוגר

פסיק אחרי המאפיין האחרון או פריט המערך האחרון אינו JSON תקני תקין. {“name”:“Alex”,“age”:30,} ו-[1, 2, 3,] נכשלים. התייחסו לזה כגורם אחד ל-Unexpected token; שגיאות JSON נפוצות: פסיק סופי, מרכאות ו-Unexpected token מכסה פסיקים סוגרים לעומק רב יותר.

לא תקין

{
  "name": "Alex",
  "age": 30,
}

תקין

{
  "name": "Alex",
  "age": 30
}
[1, 2, 3,]

3. שמות מאפיין בלי מרכאות

{ name: “Alex” } יכול להיות ליטרל אובייקט JavaScript. ב-JSON שמות החברים הם מחרוזות וצריכים מרכאות כפולות: {“name”:“Alex”}.

לא תקין

{
  name: "Alex"
}

תקין

{
  "name": "Alex"
}

4. בריחת מחרוזת לא תקינה

בטקסט JSON לוכסן הפוך מתחיל בריחה. נתיב גולמי כמו C:\Users\Alex אינו תקין כי \U אינו בריחה חוקית. הכפילו את הלוכסנים ההפוכים. אל תערבבו בריחת שפת המארח עם בריחת JSON. שגיאות JSON נפוצות: פסיק סופי, מרכאות ו-Unexpected token מכסה זאת לעומק רב יותר.

לא תקין

{"file":"C:\Users\Alex"}

תקין

{"file":"C:\\Users\\Alex"}

5. טקסט עודף לפני ה-JSON או אחריו

JSON.parse מצפה לערך JSON אחד. קידומת כמו Success: לפני {“ok”:true}, או סיומת כמו done אחריו, הופכת את כל המחרוזת ללא תקינה. רווח לבן חסר משמעות סביב ערך JSON יחיד מותר. JSON אינו אסור מלהכיל רווחים לפני הערך או אחריו.

Success:
{"ok":true}
{"ok":true}
done

6. ניתוח HTML במקום JSON

קריאה ל-response.json() על דף HTML היא מקרה נפוץ של Unexpected token. נקודות קצה שגויות, דפי HTML של 404 או 500, הפניות התחברות, גופי פרוקסי ודפי גיבוי מתחילים לעיתים קרובות בסימון. «Unexpected token < תמיד אומר HTML» חזק מדי: < הוא רמז, לא הוכחה.

fetch('/api/data')
  .then(response => response.json())

מה “Unexpected token <” אומר בדרך כלל?

ערכי JSON בדרך כלל אינם מתחילים ב-<. אם הגוף מתחיל ב- או , ייתכן ש-< הוא התו הלא חוקי הראשון. באיתור באגים מקומי בדקו סטטוס HTTP, Content-Type והגוף הגולמי. ניסוח המנוע עדיין משתנה.

בדקו את התשובה לפני הניתוח

גוף fetch ניתן לצריכה פעם אחת בלבד. באיתור באגים מקומי קראו קודם text(), בדקו קידומת קצרה, ואז הפעילו JSON.parse על אותה מחרוזת. אל תקראו ל-response.json() ואז ל-response.text() על אותה תשובה. אל תרשמו מטעני ייצור רגישים כברירת מחדל.

const response = await fetch(url);
const text = await response.text();

console.log(response.status);
console.log(response.headers.get("content-type"));
console.log(text.slice(0, 200));

try {
  const data = JSON.parse(text);
  console.log(data);
} catch (error) {
  console.error("Invalid JSON:", error);
}

מה פירוש “at position 123”?

חלק מהמנועים מדווחים מיקום, שורה או עמודה. חפשו לידם מרכאה, פסיק, סוגריים מסולסלים או בריחה גרועים. האינדקס הוא המקום שבו הניתוח הבחין בבעיה; הסיבה האמיתית יכולה להיות מוקדם יותר. אין הבטחה שזה התו הפגום המדויק.

Unexpected token מול Unexpected end

Unexpected token פירושו שהמנתח פגש תו שלא ציפה לו. Unexpected end יכול להופיע כשהקלט נעצר לפני שהערך הושלם, כמו ב-{“name”:“Alex” בלי סוגריים מסולסלים סוגרים. הניסוח המדויק תלוי במנוע. שגיאות JSON נפוצות: פסיק סופי, מרכאות ו-Unexpected token מכסה JSON חסר בהיקף רחב יותר.

{"name":"Alex"

JSON אינו ליטרל אובייקט JavaScript

JSON הוא פורמט נתונים. ליטרל אובייקט JavaScript הוא תחביר JavaScript. אובייקט JS עם מפתחות בלי מרכאות, מרכאות בודדות ופסיק סוגר אינו טקסט JSON תקין. JSON.parse אינו יכול לנתח בבטחה ליטרלים של אובייקט JavaScript.

const data = {
  name: 'Alex',
  active: true,
};
{
  "name": "Alex",
  "active": true
}

האם JSON יכול להכיל הערות?

JSON תקני אינו תומך בהערות. שורת // בתוך אובייקט אינה תקינה. JSON5 והרחבות דומות הם פורמטים אחרים. עיצוב והשוואת JSON מאמת JSON תקני עם JSON.parse ואינו מתייחס ל-JSON5 כאל JSON.

{
  // user name
  "name": "Alex"
}

האם undefined, NaN ו-Infinity תקפים ב-JSON?

לא. ערכי JSON הם אובייקט, מערך, מחרוזת, מספר, true, false ו-null. undefined, NaN ו-Infinity אינם. ערך ברמה העליונה אינו חייב להיות אובייקט או מערך: true, 123, “hello” ו-null הם JSON תקין.

{"a":undefined}
{"a":NaN}
{"a":Infinity}
true
123
"hello"
null

איך מתקנים שגיאת Unexpected token שלב אחר שלב

עבדו על המקור, לא על מחרוזת השגיאה:

  1. אשרו שהקלט באמת JSON, לא HTML, יומנים או JavaScript.
  2. בדקו את התווים הראשונים של הקלט הגולמי.
  3. אם הגיע מ-API, בדקו סטטוס HTTP ו-Content-Type. לא 200 ולא application/json מבטיחים JSON תקין.
  4. אמתו את התחביר במנתח JSON.
  5. השתמשו במיקום, שורה או עמודה שדווחו כרמז, לא כסיבת שורש מובטחת.
  6. בדקו מרכאות, פסיקים, סוגריים מסולסלים, סוגריים מרובעים ובריחות ליד האזור.
  7. השוו לעותק מעוצב ומאומת.
  8. תקנו את המסדר או את נקודת הקצה. אל תמחקו באקראי את האסימון שדווח.
אל «תתקנו» JSON בהחלפת מרכאות באקראי

החלפה גלובלית של ' ב-" עלולה לשבור גרשים בתוך מחרוזות, טקסט שכבר ברח, ומקורות שאינם JSON. ייצרו JSON תקין מהמסדר האמיתי. אל תתייחסו ל-eval כאל מנתח JSON.

השתמשו ב-JSON.stringify() כשמייצרים JSON ב-JavaScript

העדיפו JSON.stringify על שרשור מחרוזות ידני. הוא פולט טקסט JSON תקין לערכים שהוא מסדר. הוא אינו שומר כל ערך JavaScript: ל-undefined, לפונקציות ולסמלים יש התנהגות מיוחדת. הפרט הזה מחוץ להיקף כאן.

const data = {
  name: "Alex",
  active: true
};
const json = JSON.stringify(data);
// {"name":"Alex","active":true}

JSON לא תקין מול תיקון אמיתי

הזוגות האלה נבדקו עם JSON.parse. ל-HTML התיקון הוא התשובה, לא עריכת תחביר.

בעיה לא תקין תיקון
מרכאות בודדות {'a':1} {"a":1}
פסיק סוגר {"a":1,} {"a":1}
מפתח בלי מרכאות {a:1} {"a":1}
undefined {"a":undefined} {"a":null}
גוף HTML <html>... בדקו את נקודת הקצה ואת התשובה הגולמית. אל תערכו HTML ל-JSON.

מדריך החלטה פשוט ל-Unexpected token

אם JSON.parse נכשל, החליטו אם בכלל יש לכם JSON לפני שתכתבו מחדש מרכאות.

  • JSON.parse נכשל
  • מ-API? בדקו סטטוס, Content-Type והגוף הגולמי
  • האם זה מתחיל כ-JSON? אם לא, תקנו את המקור או את נקודת הקצה
  • אם כן, אמתו מרכאות, פסיקים, סוגריים, בריחות, ערכים לא נתמכים
  • השתמשו במיקום שדווח כרמז
  • תקנו את המקור ואז נתחו שוב
Unexpected token נותן שם להפתעה. מקור הטקסט הוא לעיתים קרובות התיקון האמיתי.

אמתו JSON לפני ניתוח או שימוש

NEXNARA עיצוב והשוואת JSON מאמת JSON בדפדפן עם JSON.parse—לא eval.

אמתו, עיצוב יפה עם 2 רווחים, 4 רווחים או טאבים, מזעור, העתקה, הורדה והעלאת .json. JSON Diff מכסה אובייקטים ומערכים מקוננים, נתיבים, סיכום, מסננים והחלפה. אחרי ניתוח, עותקים יפים וממוזערים של אותם נתונים מושווים כשווים; מפתחות אובייקט מושווים לפי שם.

טקסט גדול מ-5 MB עלול להרגיש איטי. טקסט גדול מ-15 MB אינו מעובד בדפדפן.

אימות JSON ועיצוב מתרחשים בדפדפן שלכם. הכלי הזה אינו שולח את ה-JSON לשרת NEXNARA. פרסומות ותכונות אתר אחרות עדיין משתמשות ברשת.

הדביקו את המחרוזת שנכשלה ב-עיצוב והשוואת JSON וקראו את התווים הראשונים לפני שתכתבו מחדש מרכאות.

FAQ

למה JSON.parse אומר Unexpected token?

הטקסט אינו JSON תקין בנקודה שבה המנתח עצר. גורמים טיפוסיים: מרכאות, פסיקים, טקסט עודף, או גוף שאינו JSON כמו HTML.

מה פירוש Unexpected token < in JSON?

התו הלא חוקי הראשון יכול להיות <. זה לעיתים קרובות מצביע על דף HTML, אבל זו אינה הוכחה ל-404 או ל-HTML בכל מקרה. בדקו סטטוס, Content-Type והגוף הגולמי.

איך מוצאים את מיקום השגיאה ב-JSON?

אם המנוע מדווח מיקום, שורה או עמודה, הסתכלו לידם. הטעות האמיתית יכולה להיות מוקדם יותר. השתמשו בזה כרמז, ואז אמתו.

האם JSON יכול להשתמש במרכאות בודדות?

לא. מחרוזות JSON תקני ושמות חברים משתמשים במרכאות כפולות.

האם JSON יכול לכלול פסיק סוגר?

לא. JSON תקני אינו מתיר פסיק אחרי המאפיין האחרון או פריט המערך האחרון.

איך בודקים אם מחרוזת היא JSON תקין?

קראו ל-JSON.parse ב-try/catch, או הדביקו את הטקסט ב-עיצוב והשוואת JSON. אם הניתוח זורק SyntaxError, המחרוזת אינה JSON תקין.

עזרה טכנית

שגיאות JSON נפוצות: פסיק סופי, מרכאות ו-Unexpected token

תקנו JSON לא תקין: פסיק סופי, מרכאות בודדות, מפתחות בלי מרכאות, ו-Unexpected token. ראו למה JSON.parse נכשל ואיך לאמת JSON.

עזרה טכנית

JPG מול PNG לצילומי מסך: מה קטן יותר?

בחרו JPG או PNG לצילום מסך לפי התוכן: UI וטקסט לרוב נשארים חדים יותר כ-PNG; פריימים עתירי תצלום עשויים להיות קטנים יותר כ-JPEG.

עזרה טכנית

איך להקטין גודל קובץ תמונה בלי לטשטש אותה

הקטינו גודל קובץ של תצלום ותמונה תוך שמירה על איכות ויזואלית סבירה. שנו ממדים גדולים מדי קודם, אחר כך דחסו במתינות, ואז בחרו פורמט מתאים.

עזרה טכנית

מ-Unix Timestamp לתאריך: שניות, אלפיות שנייה ו-UTC מוסברים

המירו Unix timestamp לתאריך. ראו שניות מול אלפיות שנייה, UTC מול שעון מקומי, ISO 8601, ואיך להחזיר תאריך לזמן epoch.

עזרה טכנית

למה Base64 מגדיל קבצים?

Base64 בדרך כלל מגדיל נתונים בינאריים בכשליש. ראו את מבנה 3 הבתים ל־4 תווים, הריפוד, התוספת של Data URL, ומתי הגודל הנוסף משתלם.