JSON 轉 POJO 轉換器:產生 Java 類別或 record
貼上 JSON,就能得到可直接使用的 Java 程式碼:每個物件一個類別,附有 private 欄位、無參數建構子,以及 getter 和 setter;你也可以改成 Java record。巢狀物件會寫在父類別裡面,整份結果可以放進同一個 .java 檔案。需要保留原本的 JSON 鍵名時,可以加上 Jackson 或 Gson 註解。轉換在瀏覽器中進行,你的 JSON 不會上傳。
使用方式:貼上 JSON,複製 Java 程式碼
- 把 JSON 貼到 JSON 欄位(欄位顯示「在這裡貼上 JSON...」)。貼上的內容會立刻轉換。如果是自己輸入,停下來約 300 毫秒後程式碼才會更新。
- 查看 Java 程式碼 下方的類別。再下面會有一行,例如「已產生 2 個類別。」,告訴你寫出了幾個。
- 按下程式碼正下方的 複製。按鈕會短暫顯示「已複製」。請把程式碼存成與根類別同名的檔案,例如
Root.java。 - 想改變結果,請展開 設定:輸入 根類別名稱(預設為
Root),在 註解 中選擇 無、Jackson 或 Gson,或勾選 使用 record 取代類別。一變更設定,程式碼就會更新。 - 按下 清除 可以清空欄位,重新開始。
範例:貼上 JSON,得到 Java 類別
你貼上的內容:{ "user_id": 7, "name": "Ana", "price": 4.5, "tags": ["a", "b"], "address": { "city": "Kyoto" } }
把 註解 設為「無」時,結果會以 import java.util.List; 和 public class Root 開頭。欄位有 Integer userId、String name、Double price、List<String> tags 和 Address address。接著是無參數建構子,以及 getUserId、setUserId 這類 getter 和 setter。
巢狀的 address 物件變成 Address,也就是 Root 裡的一個 public static class,所以一個檔案就夠了。鍵名 user_id 變成了欄位 userId,狀態列會提醒你:「已調整 1 個欄位名稱以符合 Java 的寫法。」
產生 Java record 並加上 Jackson 註解
把 根類別名稱 設為 Order,在 註解 選擇 Jackson,並勾選 使用 record 取代類別。同一份 JSON 就會變成 public record Order(...)。
每個 record 元件都帶有 @JsonProperty("key"),內容是原本的 JSON 鍵名,所以 user_id 仍會對應到 userId。選擇 Gson 時,同樣的元件會改帶 @SerializedName("key"),並附上 Gson 的 import。record 需要 Java 16 或更新版本。
JSON 型別如何對應成 Java 型別
所有型別都是包裝型別(boxed),所以每個欄位都可以缺少或是 null。
- 整數,例如
7:Integer。超出範圍(12345678901):Long。更大(99999999999999999999):BigInteger,並附上 import。 - 有小數點或指數的數字,例如
4.5、1.0、2e3:Double。 - 文字:
String。true或false:Boolean(getter 是getActive,不是isActive)。null:Object。 - 只含一種型別的陣列,例如
["a", "b"]:List<String>,並匯入java.util.List。空陣列或混合型別:List<Object>。陣列裡的陣列:List<List<Integer>>。 - 物件:以鍵名命名的巢狀類別或 record。
數字會依照原本的寫法讀取,所以很長的 ID 不會被四捨五入。import 只在程式碼用到時才會加入。同一個物件裡若有重複的鍵,以最後一個為準。
類別與欄位名稱怎麼決定
user_id和user-name會變成欄位userId和userName(駝峰式命名)。class這類 Java 關鍵字會變成_class。- 以數字開頭的名稱,例如
2nd,會變成_2nd。 - 內含物件陣列的鍵
items,會產生類別Item和欄位List<Item>:鍵名會改成單數。 - 內含物件的鍵
String會變成StringData。會蓋過String、List或Object的名稱,結尾會加上Data。 - 兩個物件同名時,第二個類別會加上編號,因為同一個檔案裡的類別名稱不能重複。
根類別名稱會整理成有效的 Java 名稱,欄位留空時則使用 Root。如果 JSON 本身是以物件陣列開頭,Root 描述的是其中一個元素,頁面也會提示你把 JSON 當作 List<Root> 來讀取。
JSON 無法被接受時
讀取方式和 JSON 本身一樣嚴格:註解、單引號和結尾多餘的逗號都會視為錯誤。「無法讀取這份 JSON」下方會顯示清楚的原因和位置,例如「第 3 行,第 5 欄」,像是「解析器停在「}」。請檢查它前面是否少了逗號、冒號、括號或引號。」
- 如果你的文字是鍵沒有引號、或使用單引號的 JavaScript 物件,請先用「JavaScript 物件轉 JSON」處理成嚴格的 JSON。
- 想在轉換前整理 JSON,可以使用「JSON格式化工具」。
- 想用結構描述檢查 JSON,可以使用「JSON Schema 驗證器」。
- 想從 JavaScript 產生 TypeScript 介面,請看「JS 轉 TS 轉換器」。
像 42 或純數字陣列這種有效但沒有物件的 JSON,會顯示「這份 JSON 裡沒有可以轉成類別的物件。」超過 2,000,000 個字元的文字,以及超過 200 層的巢狀結構,都會被拒絕。
常見問題
如何在 Java 中把 JSON 做成 POJO?
把 JSON 貼到「JSON」欄位,再複製「Java 程式碼」裡的程式碼。每個 JSON 物件會得到一個類別,附有 private 欄位、public 的無參數建構子,以及 public 的 getX 和 setX 方法。把程式碼存成與根類別同名的檔案,例如 Root.java,再用 Jackson 或 Gson 讀取 JSON。
如何把 JSON 陣列轉成 Java 物件?
直接貼上物件陣列即可。工具會把陣列中的一個元素寫成根類別,並提示你把 JSON 當作 List 來讀取。在 Jackson 中是 TypeReference>,在 Gson 中是 TypeToken>。物件裡的陣列會變成 List 欄位,類別以鍵名命名。
如何用 Jackson 或 Gson 保留原本的 JSON 鍵名?
開啟「設定」,在「註解」中選擇 Jackson 或 Gson。Jackson 會在每個欄位加上 @JsonProperty("key"),Gson 則加上 @SerializedName("key"),並附上 import。選「無」時,像 user_id 這樣的鍵會變成欄位 userId,除非用註解或命名策略保留原本的鍵,否則無法再對應回 JSON。
可以從 JSON 產生 Java record 嗎?
可以。在「設定」中勾選「使用 record 取代類別」。每個 JSON 物件會變成 public record Name(Type a, Type b) {},巢狀物件則變成父 record 裡的 record。record 需要 Java 16 或更新版本。註解仍然有效,會放在每個 record 元件上。
為什麼 JSON 數字有時是 Integer,有時是 Double?
型別取決於數字的寫法。整數是 Integer;太大放不下就是 Long;再大就是 BigInteger。寫成有小數點或指數的數字則是 Double,即使它是 1.0。
陣列中的物件鍵不一樣時會怎麼處理?
它們會合併成一個類別,包含任何一個物件出現過的所有鍵,所以只有部分物件才有的鍵也會有欄位。如果某個鍵含有不同型別,或陣列是空的,欄位型別就會是 Object 或 List。這類欄位請自行檢查。
會產生 Kotlin 類別或 Lombok 註解嗎?
不會。輸出是單純的 Java:附 getter 和 setter 的類別,或 record。如果你使用 Lombok,請刪掉 getter 和 setter 方法,並在類別上加 @Data。Kotlin 的 data class 需要另外撰寫。
JSON 可以多大?會上傳嗎?
最多 2,000,000 個字元,巢狀最多 200 層。轉換在你的瀏覽器中進行,所以 JSON 不會上傳,也不會儲存在任何地方。