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 字符串或 JSONArray
$.ajax({
url: "/api/users",
success: function(jsonStr) {
var list = JSON.parse(jsonStr); // 直接得到 JS 陣列/對象
list.forEach(item => console.log(item.name));
}
});
依賴:net.sf.json-lib:json-lib 或 com.alibaba:fastjson / com.fasterxml.jackson.core:jackson-databind(推薦現代項目用 Jackson/Fastjson)。
// 使用 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>() {});
}
// 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 |