JSON 字串轉 Java 物件:從零打造解析器
在 Java 開發中,將 JSON 字串轉換為 Java 物件是常見需求。雖然成熟的庫如 Jackson、Gson 已非常好用,但理解底層解析邏輯對於排查疑難雜症、處理非標準 JSON 格式大有裨益。本文將帶你從零實作一個簡易且功能完整的 JSON 解析器,支援物件、陣列、巢狀結構及基本型別。
核心設計思路
解析器採用遞歸下降策略,主流程如下:
- 型別判斷:根據首尾字元(`{}`、`[]`、其它)判斷是 Map、List 還是純值。
- Token 化處理:逐字元掃描,處理引號、括號、冒號、逗號等結構符號,分離 key/value。
- 遞歸解析:遇到巢狀 `{}` 或 `[]` 時遞歸呼叫解析方法,構建完整物件樹。
完整程式碼實作
import java.util.*;
import com.jfinal.kit.JsonKit;
public class JsonToJavaObject {
public static void main(String[] args) {
String json = "{\"aa\":123,\"cc\":[1,2,3,4,{\"cd\":\"f\",\"bb\":234}]}";
Object obj = parse(json);
System.out.println(JsonKit.toJson(obj)); // 驗證輸出
}
public static Object parse(String json) {
if (json == null) return null;
json = json.trim();
String type = typeof(json);
switch (type) {
case "map": return parseMap(json);
case "list": return parseList(json);
default: return json; // 純值直接返回
}
}
private static Map parseMap(String json) {
if (!"map".equals(typeof(json))) throw new RuntimeException("非 Map 格式");
Map map = new HashMap<>();
parseToken(map, json, null);
return map;
}
private static List
測試輸入與輸出
輸入:
{"aa":"123","cc":["1","2","3","4",{"bb":"234","cd":"f"}]}
輸出(經 JsonKit 序列化後):
{"aa":"123","cc":["1","2","3","4",{"bb":"234","cd":"f"}]}
適用場景與注意事項
- 適合學習 JSON 解析原理、處理非標準 JSON(如無引號 key、單引號字串)。
- 生產環境建議直接使用 Jackson / Gson,效能與健壯度更優。
- 此實作未處理轉義字元、Unicode、數值科學記號等細節,若需完整相容 RFC 8259 請擴充
parseToken 邏輯。
掌握手寫解析器,能在面對「髒資料」或「受限環境無法引入第三方庫」時遊刃有餘。完整原始碼可直接複製至 IDE 執行驗證。