JSON (JavaScript Object Notation) 是現代 Web 數據交換的事實標準。本文系統梳理 JSON 語法規則、支持的數據類型、完整示例,並深度對比 JavaScript 中 eval、JSON.parse、$.parseJSON 三種解析方式的優劣與安全性。
| 類型 | 說明 | 示例 |
| Number | 雙精度浮點 (無長整型區分) | 123, 3.14, -10, 1e5 |
| String | 雙引號包裹,支持 Unicode 轉義 | "hello", "\u4e2d\u6587" |
| Boolean | true / false | true |
| Array | 有序值序列 | [1, "two", true, null] |
| Object | 無序鍵值對集合 | {"id": 1, "name": "Tom"} |
| null | 空值 | null |
三、完整示例:圖書集合
{
"book": [
{
"id": "01",
"language": "Java",
"edition": "third",
"author": "Herbert Schildt"
},
{
"id": "07",
"language": "C++",
"edition": "second",
"author": "E.Balagurusamy"
}
]
}
四、JavaScript 三種解析方式深度對比
1. eval() —— 強大但危險
function strToJson(str) {
return eval('(' + str + ')'); // 必須加括號將對象字面量轉為表達式
}
優點:支持 JS 完整語法 (函數、正則、單引號、尾隨逗號)。
致命缺點:任意代碼執行風險,若字符串來自不可信源 (用戶輸入、第三方 API),可導致 XSS 攻擊。嚴禁用於生產環境解析外部數據。
2. JSON.parse() —— 標準、安全、嚴格
function strToJson(str) {
return JSON.parse(str);
}
優點:原生瀏覽器支持 (IE8+),嚴格遵循 RFC 8259,無代碼執行風險,性能最優。
限制:要求嚴格合法 JSON — 屬性名必須雙引號、無尾隨逗號、無註釋、無單引號字符串。違規直接拋 SyntaxError。
3. $.parseJSON() (jQuery) —— 兼容性封裝
function strToJson(str) {
return $.parseJSON(str); // 內部調用 JSON.parse 或兼容性 polyfill
}
特點:jQuery 1.4.1+ 引入,早期為兼容無原生 JSON.parse 的舊瀏覽器;現代版本直接代理 JSON.parse。行為與 JSON.parse 一致,同樣要求嚴格合法 JSON。
五、對比總結表
| 維度 | eval() | JSON.parse() | $.parseJSON() |
| 安全性 | 極低 (代碼注入) | 高 (純數據解析) | 高 |
| 語法寬容度 | 高 (全 JS 語法) | 零 (嚴格 RFC) | 零 |
| 性能 | 低 (編譯執行) | 最高 (原生優化) | 高 (代理原生) |
| 適用場景 | 受信任的動態代碼執行 | 所有生產環境 JSON 解析 | jQuery 專案統一風格 |
| 推薦等級 | ⭐ (禁用於數據解析) | ⭐⭐⭐⭐⭐ (首選) | ⭐⭐⭐⭐ (次選) |
六、最佳實踐建議
- 生產環境唯一推薦
JSON.parse(),或封裝統一異常處理:try { return JSON.parse(str); } catch (e) { logError(str); return null; }
- 後端生成 JSON 必須保證合法性:使用成熟庫 (Jackson、Gson、Fastjson) 序列化,手動拼接 JSON 字符串極易出錯。
- 若需解析類 JSON (帶註釋、單引號),使用專用庫如
json5、comment-json,切勿用 eval。
- 傳輸大數據時考慮流式解析 (Jackson
JsonParser、Gson.stream) 避免 OOM。
- 上一篇文章: Java 進制轉換完全指南:二進制、八進制、十進制、十六進制互轉算法與負數表示
- 下一篇文章: Java String 源碼深度解析:不可變性、字元陣列、緩存機制與效能優化
Copyright ©
程式碼之家 All Rights Reserved