網絡請求返回的數據多為 JSON 格式。早期手動 optString/getInt 逐字段解析不僅繁瑣,還極易因字段變更導致崩潰。本文介紹如何利用成熟庫(Gson/Fastjson)實現 JSON 到 Java 實體類的自動雙向映射,大幅提升開發效率與穩定性。
{"key": "value"}、數組 ["a", "b"]。org.json 包(JSONObject/JSONArray)僅適合極簡單場景。public class User {
private String id;
private String name;
private String from;
// Getter/Setter 省略(Lombok @Data 一鍵生成)
@Override
public String toString() {
return "User[id=" + id + ", name=" + name + ", from=" + from + "]";
}
}
// 依賴:implementation 'com.google.code.gson:gson:2.10.1'
// JSON 字符串 → 實體對象
String json = "{\"id\":\"16\",\"name\":\"小李\",\"from\":\"河南\"}";
User user = new Gson().fromJson(json, User.class);
// 實體對象 → JSON 字符串
String jsonOut = new Gson().toJson(user);
優勢:標準兼容性佳、支持泛型 TypeToken、字段命名策略(@SerializedName)、自定義 TypeAdapter 處理複雜類型(日期、枚舉)。
// 依賴:implementation 'com.alibaba:fastjson:2.0.41'
User user = JSON.parseObject(json, User.class);
String jsonOut = JSON.toJSONString(user);
優勢:序列化/反序列化速度極快、功能豐富(@JSONField、過濾、循環引用處理)。注意:1.x 版本有歷史安全漏洞,務必升級 2.x。
// JSON 數組 → List
String jsonArray = "[{\"id\":\"1\"},{\"id\":\"2\"}]";
Type listType = new TypeToken<List<User>>(){}.getType(); // Gson
List<User> users = new Gson().fromJson(jsonArray, listType);
// Fastjson
List<User> users2 = JSON.parseArray(jsonArray, User.class);
JsonUtil 捕獲 JsonSyntaxException/JSONException,返回 Optional<T> 或統一 Result 對象。snake_case,前端實體 camelCase,配置 GsonBuilder.setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES) 或 @SerializedName。"2024-01-15T14:30:00Z",註冊統一 TypeAdapter<LocalDateTime>。-keep class com.example.model.** { *; } 防止混淆導致字段丟失。原文嘗試用反射 + Class.forName 實現通用解析,但缺乏類型轉換、異常處理、性能優化,屬於重造輪子且輪子不圓。生產環境請直接用 Gson/Fastjson/Jackson/Kotlinx.serialization。