JSON Toolkit

השוואת ספריות לפרסור ולעיבוד JSON

שורה תחתונה: ממשקי API מקוריים הם המהירים ביותר, מפרסרים סובלניים מספקים היסטים. בחרו לפי שלושה דברים: איתור השגיאה, האם הטקסט המקורי נשמר, והאם הגבולות מפורשים.

בינוניכ-11 דקות קריאהפורסם 2026-10-30עודכן 2026-10-30
תמונת כריכה של השוואת ספריות לפרסור ולעיבוד JSON

שורה תחתונה: סווגו קודם את הצורך, אחר כך השוו מימושים — השתמשו ב-JSON.parse המקורי לקריאה בלבד, ב-jsonc-parser כשצריך היסטים או חייבים לשמר את הפורמט המקורי, והוסיפו ספריות שאילתה או patch רק במקום שנדרש; טענו עצלות ספריות גדולות לפי דף והשליכו כאלה שאינן מתוחזקות.

כל ספרייה מצהירה שהיא "מהירה, קטנה ושלמה". מה שבאמת מבדיל ביניהן הוא כמה מידע הן נותנות כשמשהו משתבש.

1. ארבע קטגוריות לפי מטרה

קטגוריה ספריות מייצגות מה היא פותרת
פרסור סטנדרטי JSON.parse / JSON.stringify תחביר ↔ אובייקט, מהירות קודם
פרסור סובלני + עריכה jsonc-parser, json5 קלט עם הערות, שגיאות מדויקות להיסט, שינויים המשמרים פורמט
שאילתה jsonpath-plus, jsonpath בחירת צמתים לפי ביטוי
שינוי fast-json-patch, immer יצירה/יישום של patch, עדכונים בלתי משתנים

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

2. השוואה צד-לצד

ספרייה איתור שגיאה סובלנות (הערות/פסיקים בסוף) שומרת על הפורמט המקורי תרחישים מתאימים
JSON.parse הודעה ומיקום בלבד (תלוי מנוע) ✗ ✗ פרסור ברירת מחדל, נתוני API
jsonc-parser offset מדויק + קוד שגיאה ✓ ✓ (modify + applyEdits) עורכים, קובצי הגדרה
json5 מידע שורה ועמודה ✓ (סובלני יותר) ✗ קריאת הגדרות JSON5
jsonlint מידע שורה ועמודה ✗ ✗ לעיון בלבד, אינו מתוחזק באופן פעיל
jsonpath-plus שגיאות תחביר של ביטוי — — שאילתות לפי ביטוי
fast-json-patch שגיאות ברמת פעולה — — יצירה ויישום של patch
lz-string — — — דחיסת JSON לתוך URL

הודעות השגיאה של JSON.parse משתנות מאוד בין מנועים. V8 מייצר משהו כמו Unexpected token } in JSON at position 42, אבל האם המיקום מדויק תלוי בגרסת המנוע; jsonc-parser לעומת זאת מחזיר { error, offset, length } מובנה ויציב, שמתאים לסמני עורך.

3. ארבע נקודות החלטה מרכזיות

3.1 האם צריך היסטים

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

import { parse, printParseErrorCode } from 'jsonc-parser';

const errors: Array<{ error: number; offset: number; length: number }> = [];
parse(text, errors, { allowTrailingComma: true, disallowComments: false });

if (errors.length > 0) {
  const firstError = errors[0];
  console.error(`${printParseErrorCode(firstError.error)} at offset ${firstError.offset}`);
}

3.2 האם צריך לשמר את הטקסט המקורי

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

האחרון מאבד: הערות, סדר מפתחות (בכמה מימושים), סגנון הזחה, צורת כתיבה של ליטרל מספרי (1e3 הופך ל-1000) וצורות הימלטות (\u4e2d הופך לתו עצמו).

3.3 האם התנהגויות הגבול מפורשות

לפני בחירת ספרייה, בדקו בתיעוד שלושה דברים:

  1. איך מטפלים במפתחות כפולים (שמירת האחרון / זריקת שגיאה);
  2. האם מספרים שלמים גדולים מאבדים דיוק (רוב ספריות ה-JS כן, כי כולן עוברות דרך Number);
  3. ההיקף הנתמך של BOM, הערות ופסיקים בסוף.

אם אין תיעוד, כתבו דגימה קטנה ובדקו בעצמכם. זה אמין יותר מקריאת ה-README.

3.4 מצב תחזוקה

הסיכון של ספריית JSON אינו פונקציות חסרות, אלא הזנחה ארוכת טווח: אף אחד לא ישחרר עדכוני אבטחה (prototype pollution, ReDoS) יותר.

4. השוואה לשפות אחרות

שפה ספרייה סטנדרטית / ספרייה מיינסטרימית הבדל מרכזי
JavaScript JSON.parse כל המספרים בדיוק כפול
TypeScript כמו למעלה + jsonc-parser / zod טיפוסים קיימים רק בזמן קומפילציה
Go encoding/json float64 כברירת מחדל, השתמשו ב-UseNumber() כדי לשמר דיוק; json.RawMessage לפרסור דחוי
Java Jackson / Gson / Moshi עם Jackson, היזהרו מהסיכון של הפעלת default typing
Python json / orjson parse_float=Decimal שומר דיוק; orjson מהיר יותר אבל לא תומך בכל הטיפוסים
Rust serde_json דה-סריאליזציה עם טיפוסים חזקים; התכונה arbitrary_precision שומרת דיוק
C++ simdjson / RapidJSON simdjson מכוון לתפוקת פרסור, RapidJSON כללי יותר

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

5. שילובים טיפוסיים

אפשרות 1: אתר כלי (צד דפדפן)

Parsing and error location: jsonc-parser
Editor: CodeMirror 6 + @codemirror/lang-json
Query: jsonpath-plus
Patch: fast-json-patch
Share links: lz-string

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

אפשרות 2: שער API בצד שרת

Validation: Ajv (compile the schema once, reuse it)
Parsing: native JSON.parse (together with a body size limit)
Deferred parsing of large fields: keep the raw string, parse only when needed

אל תכניסו ספריות שאילתה/patch לשכבת השער כדי לממש לוגיקה עסקית — זה תפקיד שכבת העסק.

אפשרות 3: CLI וסקריפטים

Pick fields: jq
Format conversion: yq / dasel
Interactive browsing: jless
Batch validation: ajv-cli

6. ההשפעה האמיתית של גודל החבילה והביצועים

  • jsonc-parser קטן מאוד ומתאים לחבילה הראשית;
  • json5 גדול מעט מ-jsonc-parser כי הוא תומך ביותר תחביר;
  • jsonpath-plus כולל הערכת ביטויים וגדול במידה ניכרת, ולכן יש לטעון אותו בעצלות לפי דף;
  • fast-json-patch בגודל בינוני ונדרש רק כשיש תכונת השוואה.

האופטימיזציה פשוטה: יבאו דינמית לפי דף, ואל תכניסו אותם ל-chunk של המסך הראשון.

const { JSONPath } = await import('jsonpath-plus');

7. רשימת בדיקה

  • [ ] בחרו ספריות לפי מטרה; אל תשתמשו בספריית שאילתה לפרסור;
  • [ ] השתמשו ב-jsonc-parser כשצריך מיקומי שגיאה מדויקים;
  • [ ] השתמשו ב-API בסגנון עריכה כשההערות והפורמט חייבים להישמר;
  • [ ] בדקו בפועל את שלוש התנהגויות הגבול: מפתחות כפולים, מספרים שלמים גדולים ו-BOM;
  • [ ] עקבו אחרי מצב התחזוקה של הספרייה והתראות האבטחה;
  • [ ] יבאו דינמית ספריות גדולות לפי דרישה.

FAQ

איך בוחרים ספריית JSON לפי גודל הפרויקט?

כלים קטנים שקוראים רק נתוני API יכולים להישאר עם JSON.parse המקורי. פרויקטים שצריכים מיקומי שגיאה ברמת עורך או חייבים לשמר את הפורמט המקורי צריכים להשתמש ב-jsonc-parser. שער בצד שרת צריך רק אימות ופרסור, ומשאיר ספריות שאילתה ו-patch לשכבת העסק, בעוד שסקריפטים ב-CLI יכולים להשתמש ישירות ב-jq, yq ו-ajv-cli.

למה מצב תחזוקה חשוב יותר ממספר הפונקציות?

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

כדאי להשתמש ב-JSON.parse כדי לשנות שדה אחד ולשמור הערות והזחה?

לא. פרסור, שינוי האובייקט ואז סריאל מאבדים הערות, סדר מפתחות, סגנון הזחה, צורת כתיבה של ליטרל מספרי (1e3 הופך ל-1000) וצורות הימלטות (\u4e2d הופך לתו עצמו). שינוי שדה אחד תוך שמירה על כל השאר דורש API בסגנון עריכה כמו modify ו-applyEdits ב-jsonc-parser.