LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

JSON 沒錯,但就是 parse 不過?我懂了

liguoquan
2025年6月30日 9:4 本文熱度 601
?:JSON 沒錯,但就是 parse 不過?我懂了


她說:JSON 沒錯,但就是 parse 不過?我懂了!

6,363閱讀5分鐘
專欄: 
夜間日記

技術純享版:《不規范 JSON 怎么辦?三種修復思路+代碼實現》

開篇:夜色漸濃,佳人亦在

那天晚上,辦公室的燈已經滅了大半,只剩幾個工位發出輕輕的藍光。中央空調早就熄了,但顯示器的熱度依然在屏幕前形成一圈圈淡淡的光暈。

我坐在靠窗的位置,剛把代碼提交推送完,正打算收鍵盤走人。

這時,小語走過來,端著還冒著熱氣的速溶咖啡——她果然又是那個留下來最晚的人之一。

“誒~”她蹲在我旁邊的桌子邊上,語氣帶著一絲挫敗,“你這邊有沒有遇到 JSON 字符串明明格式看著沒錯,卻死活 JSON.parse 不過的情況?”

一個普通的錯誤,卻不是普通的崩潰

原來她在調試一個用戶日志上傳模塊,前端接收到的日志數據是從后端來的 JSON 字符串。

問題出在一個看似再平常不過的解析操作上——

const logData = JSON.parse(incomingString);

可是控制臺總是報錯:Unexpected token。數據一眼看去也沒問題,{'name': 'Tom', 'age': 30} —— 結構清晰,屬性齊全,但偏偏就是“壞掉了”。

她抿了一口咖啡,苦笑,“我知道是引號的問題,可這種數據是從破舊的系統里吐出來的,量還特別大,我不可能一個個手動改。”

風起 · JSON.parse 不是萬靈藥

我們一起回顧了她的實現方式。她用的是最基礎的 JSON.parse(),這是我們在項目里默認的處理方式——簡單、直接、快速。

但這個方法對 JSON 格式的要求極其嚴格:

  • 只能使用雙引號 "
  • 屬性名必須加引號
  • 不容忍任何額外字符或注釋

一旦出現諸如單引號、缺少逗號、多余空格這些“微小過失”,就直接拋錯了。

小語嘆氣,“很多時候這些 JSON 是設備端拼出來的,不規范,又沒有錯誤提示,我根本不知道該怎么修。”

我翻了翻之前的代碼,從夾縫中找出來一張破舊的黃皮紙,我們倆一起瞅了上去,看到上面寫著

function tryParseJSON(jsonString) {  try {    return JSON.parse(jsonString);  } catch (e) {    // 嘗試簡單修復:去除可能的多余字符    const cleaned = jsonString.replace(/[^\x20-\x7E]/g, '').trim();    try {      return JSON.parse(cleaned);    } catch (e2) {      console.error("無法解析JSON:", e2);      return null;    }  } }

下面備注了一行小字:此法在一些更輕量的場景里,做一些“簡陋修復“,對于簡單的問題有時能奏效,但對于更復雜的錯誤,比如混合了單引號和雙引號的情況,只能再實現另一個方法可以做更針對性的修復方法

function fixQuotes(jsonString) {  // 將單引號替換為雙引號(簡單情況)  return jsonString.replace(/'/g, '"'); }

小語感嘆一聲:“沒有更好的了嗎?”

解決篇 · 來自大佬的一句話

恰好這時,阿杰從會議室出來,耳機還掛在脖子上。

他聽了一耳朵后隨口說了句:“你們試過 jsonrepair 嗎?那玩意能把壞 JSON 修回來,就像修車。”

“json... repair?”小語一臉困惑。

我忽然想起,之前有個日志監控服務也碰到類似的問題,當時就是用了這個庫一把梭。

我打開編輯器,快速翻出來了這一段:

npm install jsonrepair
const { jsonrepair } = require('jsonrepair'); const damaged = "{name: 'John', age: 30}"; const fixed = jsonrepair(damaged); // => {"name":"John","age":30} const obj = JSON.parse(fixed);

小語湊過來看了一眼,眼睛一亮:“它真的把引號補好了?”

我點頭。這個工具是為了解決類似“非標準 JSON”問題的,它會盡可能地補全缺失引號、逗號,甚至處理 Unicode 異常字符。

當然,也不是所有情況都適用。

比如碰到亂碼或者非法嵌套結構,jsonrepair 有時也會無能為力。這時可以退一步——用更寬松的解析器,比如 JSON5

const JSON5 = require('json5'); const result = JSON5.parse("{name: 'John', age: 30}"); // 也能解析

我看著認真學習的小語,語重心長的講道:它不是修復,而是擴展 JSON 標準,讓一些非標準寫法也能解析(JSON5 能容忍的內容包括:單引號、尾逗號、注釋、未加引號的屬性名、十六進制、科學計數法等數字格式)

接著我們還討論了更復雜的修復方式,比如用正則處理批量日志,甚至用 AST 工具逐步構建 JSON 樹。但那是更遠的故事了。

面對當前的問題,我們準備搞一套組合拳:

function parseJson(jsonString) {  // 第一步:嘗試標準JSON解析  try {    return JSON.parse(jsonString);  } catch (e) {    console.log("標準JSON解析失敗,嘗試修復...");        // 第二步:嘗試使用jsonrepair修復    try {      const { jsonrepair } = require('jsonrepair');      const fixedJson = jsonrepair(jsonString);      return JSON.parse(fixedJson);    } catch (e2) {      console.log("修復失敗,嘗試使用JSON5解析...");            // 第三步:嘗試使用JSON5解析      try {        const JSON5 = require('json5');        return JSON5.parse(jsonString);      } catch (e3) {        // 最后:如果所有方法都失敗,返回錯誤信息        console.error("所有解析方法都失敗了:", e3);        throw new Error("無法解析JSON數據");      }    }  } }

結局

一段時間后,小語在前端監控日志里貼了段截圖:原本一天上千條的 parse error 錯誤,幾乎消失了。

她補了一句:“終于不用再一個個點開調日志了。”

我回頭看她的工位,屏幕亮著,瀏覽器里是一個模擬器頁面,console 正在緩緩輸出內容。

她突然抬起頭看著我,問道:“AST是什么?聽說也能實現json修復?”


該文章在 2025/6/30 9:04:54 編輯過
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
伊人久久国产免费观看视频 | 亚洲综合久久精品一区二区 | 亚洲久悠悠色悠在线播 | 亚洲区欧美区偷拍区中文字幕 | 久久久精品成人免费看片 | 色综合天天综合高清网国产在线 |