繼上篇介紹 json-lib 後,本文聚焦 org.json (官方參考實現),特點:零依賴、極輕量 (約 30KB),適合 Android、嵌入式或對依賴大小敏感的場景。缺點是無法直接與 JavaBean 互轉,需以 Map 為中介。本文提供通用工具類 JsonHelper 彌補此短板,並給出完整構建/解析示例。
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version> <!-- 日期版本號 -->
</dependency>
| 類 | 對應 JSON 結構 | 常用方法 |
|---|---|---|
JSONObject | 對象 { } | put(key, value), getString(key), getInt(key), toString() |
JSONArray | 數組 [ ] | put(value), getJSONObject(index), length() |
JSONTokener | 解析器 | new JSONObject(new JSONTokener(jsonStr)) |
public class JsonHelper {
/** JavaBean → Map (反射獲取 getter) */
public static Map<String, Object> toMap(Object bean) {
Map<String, Object> map = new HashMap<>();
for (Method m : bean.getClass().getDeclaredMethods()) {
if (m.getName().startsWith("get") && m.getParameterCount() == 0) {
String key = lowerFirst(m.getName().substring(3));
try { map.put(key, m.invoke(bean)); } catch (Exception ignored) {}
}
}
return map;
}
/** JSON 字符串 → Map */
public static Map<String, String> toMap(String jsonStr) throws JSONException {
JSONObject jo = new JSONObject(jsonStr);
Map<String, String> map = new HashMap<>();
for (String key : jo.keySet()) map.put(key, jo.getString(key));
return map;
}
/** JavaBean → JSONObject (經 Map 中轉) */
public static JSONObject toJSON(Object bean) {
return new JSONObject(toMap(bean));
}
/** Map → JavaBean (反射調用 setter) */
public static void toJavaBean(Object bean, Map<String, Object> map) {
for (Method m : bean.getClass().getDeclaredMethods()) {
if (m.getName().startsWith("set") && m.getParameterCount() == 1) {
String key = lowerFirst(m.getName().substring(3));
if (map.containsKey(key)) {
try { m.invoke(bean, convertType(map.get(key), m.getParameterTypes()[0])); } catch (Exception ignored) {}
}
}
}
}
/** JSON 字符串 → JavaBean */
public static void toJavaBean(Object bean, String jsonStr) throws JSONException {
toJavaBean(bean, toMap(jsonStr));
}
private static String lowerFirst(String s) {
return Character.toLowerCase(s.charAt(0)) + s.substring(1);
}
private static Object convertType(Object val, Class<?> targetType) { /* 簡易類型轉換 */ return val; }
}
public class OrgJsonDemo {
static class Employee { // 需提供 getter/setter
private String name, sex; private int age;
// ... 省略 getter/setter
}
public static void main(String[] args) throws JSONException {
// 1. 構建複雜 JSON
JSONObject root = new JSONObject();
// 1.1 List
| 維度 | org.json | json-lib |
|---|---|---|
| 依賴大小 | ~30 KB,零第三方依賴 | ~500 KB,依賴 ezmorph, commons-lang/collections/beanutils/logging |
| JavaBean 互轉 | 不支持,需手寫 Map 中轉 | 原生支持 JSONObject.toBean() / JSONObject.fromObject(bean) |
| API 風格 | 接近 JavaScript 原生操作 | 更符合 Java 集合習慣 |
| 性能 | 極快,內存佔用極低 | 略慢,對象創建較多 |
| 適用場景 | Android、微服務網關、依賴極簡項目 | 傳統企業應用、需大量 Bean 互轉場景 |
org.json 以「小而美」著稱,通過 JsonHelper 封裝反射轉換邏輯,可輕鬆實現 JavaBean 雙向轉換。在依賴體積受限、性能敏感、或不願引入龐大傳遞鏈的項目中,它是 Jackson/Gson/json-lib 之外的優秀備選。