首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JSON 字符串與 Java List 集合互轉完整指南

     編輯:Java 相關知識

前端:List ⇄ JSON 字符串

List 轉 JSON 字符串(發送請求)

var list = [{id:1, name:"張三"}, {id:2, name:"李四"}];
var jsonStr = JSON.stringify(list); // "[{"id":1,"name":"張三"},{"id":2,"name":"李四"}]"
var param = { jsonStr: jsonStr }; // 作為 AJAX 參數發送

JSON 字符串轉 List(接收響應)

// 後端返回 JSON 字符串或 JSONArray
$.ajax({
    url: "/api/users",
    success: function(jsonStr) {
        var list = JSON.parse(jsonStr); // 直接得到 JS 陣列/對象
        list.forEach(item => console.log(item.name));
    }
});

後端(Java):String ⇄ List

依賴:net.sf.json-lib:json-lib 或 com.alibaba:fastjson / com.fasterxml.jackson.core:jackson-databind(推薦現代項目用 Jackson/Fastjson)。

String → List(解析)

// 使用 json-lib (舊專案常見)
public static  List stringToList(String jsonStr, Class clazz) {
    if (jsonStr == null || jsonStr.isEmpty()) return Collections.emptyList();
    JSONArray jsonArray = JSONArray.fromObject(jsonStr);
    return (List) JSONArray.toCollection(jsonArray, clazz);
}

// 使用 Fastjson (推薦)
public static  List parseArray(String jsonStr, Class clazz) {
    return JSON.parseArray(jsonStr, clazz);
}

// 使用 Jackson
public static  List parseJson(String jsonStr, Class clazz) throws JsonProcessingException {
    return new ObjectMapper().readValue(jsonStr, new TypeReference>() {});
}

List → JSON 字符串(序列化)


// json-lib
public static String listToJsonString(List list) {
    return JSONArray.fromObject(list).toString();
}

// Fastjson
public static String toJsonString(List list) {
    return JSON.toJSONString(list);
}

// Jackson
public static String writeJson(List list) throws JsonProcessingException {
    return new ObjectMapper().writeValueAsString(list);
}

實戰案例:答案對象列表雙向轉換

public class Answer {
    private int questionId;
    private int score;
    private String studentAnswer;
    private int type;
    // getter/setter 省略
}

// 1. 從請求參數構建 Answer List
private List buildAnswerList(String[] answers, int[] qIds, int[] types, int[] scores) {
    List list = new ArrayList<>();
    if (answers != null && qIds != null && types != null && scores != null) {
        for (int i = 0; i < answers.length; i++) {
            Answer a = new Answer();
            a.setQuestionId(qIds[i]);
            a.setScore(scores[i]);
            a.setStudentAnswer(answers[i]);
            a.setType(types[i]);
            list.add(a);
        }
    }
    return list;
}

// 2. List → JSON 字符串(存儲/傳輸)
public String toJsonString(String[] answers, int[] qIds, int[] types, int[] scores) {
    List list = buildAnswerList(answers, qIds, types, scores);
    return JSON.toJSONString(list); // Fastjson
}

// 3. JSON 字符串 → List(讀取/還原)
public static List fromJsonString(String jsonStr) {
    if (jsonStr == null || jsonStr.isEmpty()) return Collections.emptyList();
    return JSON.parseArray(jsonStr, Answer.class); // Fastjson
}

常見坑與最佳實踐

問題原因解決方案
日期格式不一致各庫默認格式不同統一配置 yyyy-MM-dd HH:mm:ss,或用 ISO-8601
泛型擦除導致反序列化失敗運行時無泛型信息使用 TypeReference (Jackson) 或 JSON.parseArray(str, Clazz) (Fastjson)
循環引用報錯對象圖有環配置 SerializerFeature.DisableCircularReferenceDetect 或 @JsonIgnore
null 值序列化默認策略不同統一設置 WriteNullListAsEmpty / WriteNullStringAsEmpty

技術選型建議 (2024+)

  • 新項目首選 Jackson:Spring Boot 默認、效能最優、生態最完善、支援 Kotlin/Scala。
  • 高效能場景:Fastjson 2.x (修復安全漏洞後) 或 Gson。
  • 避免使用 json-lib:停止維護多年,依賴舊版 JSON 規範,效能差。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved