如何用JSON表示List:全面指南与实例解析
在数据交互与存储中,JSON(JavaScript Object Notation)以其轻量、易读和结构化的特性,成为前后端通信、配置文件、数据序列化等场景的主流格式,而List(列表)作为编程中最常用的数据结构之一,如何在JSON中准确表示,是开发者必须的基础技能,本文将详细解析JSON中表示List的核心方法、常见场景及注意事项,帮助你在实际应用中灵活应对。
JSON中表示List的核心方法:数组(Array)
在JSON中,List(列表)本质是通过“数组”(Array)来表示的,JSON数组是一种有序的值集合,值可以是基本数据类型(如字符串、数字、布尔值)、null,也可以是嵌套的对象或数组,这与编程语言中List的“有序、可重复、可存储任意类型元素”的特性高度契合。
JSON数组的基本语法
JSON数组由方括号 [] 包裹,元素之间用逗号 分隔,语法结构如下:
[ 值1, 值2, 值3, ... ]
“值”可以是:
- 基本类型:字符串(需用双引号 包裹)、数字、布尔值(
true/false)、null; - 复合类型:对象(用 包裹的键值对)或数组(嵌套数组)。
简单示例:基本类型列表
如果List中存储的是基本类型元素,JSON数组的表示非常直观。
- 字符串List(表示用户名列表):
["张三", "李四", "王五"]
- 数字List(表示商品价格列表):
[29.9, 59.0, 99.5, 158.8]
- 布尔值List(表示任务完成状态列表):
[true, false, true, true]
复合示例:对象或嵌套数组列表
实际开发中,List更多时候存储的是复杂对象(如用户信息、订单数据),此时JSON数组中的元素会是一个个JSON对象。
- 对象List(表示用户列表):
[ {"id": 1, "name": "张三", "age": 25, "city": "北京"}, {"id": 2, "name": "李四", "age": 30, "city": "上海"}, {"id": 3, "name": "王五", "age": 28, "city": "广州"} ] - 嵌套数组List(表示矩阵或二维数据):
[ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
或更复杂的嵌套(如学生成绩列表,每个学生包含多科成绩):
[ {"name": "张三", "scores": [90, 85, 78]}, {"name": "李四", "scores": [88, 92, 80]} ]
不同编程语言中JSON与List的互转
JSON作为一种跨语言的数据格式,核心价值在于实现不同编程语言之间的数据交互,以下是常见语言中将List转换为JSON(序列化),以及将JSON解析为List(反序列化)的方法。
Python:使用 json 模块
Python 中 list 类型与 JSON 数组的转换非常简单:
-
List → JSON(序列化):
json.dumps()方法import json user_list = [ {"id": 1, "name": "张三", "age": 25}, {"id": 2, "name": "李四", "age": 30} ] json_str = json.dumps(user_list, ensure_ascii=False, indent=2) print(json_str) # 输出: # [ # { # "id": 1, # "name": "张三", # "age": 25 # }, # { # "id": 2, # "name": "李四", # "age": 30 # } # ]ensure_ascii=False:确保中文字符不被转义为\u编码;indent=2:格式化输出,提升可读性。
-
JSON → List(反序列化):
json.loads()方法parsed_list = json.loads(json_str) print(parsed_list) # 输出:[{'id': 1, 'name': '张三', 'age': 25}, {'id': 2, 'name': '李四', 'age': 30}] print(parsed_list[0]["name"]) # 输出:张三
JavaScript:原生 API 或 JSON 对象
JavaScript 中 Array 类型与 JSON 数组天然兼容:
-
Array → JSON(序列化):
JSON.stringify()const userList = [ { id: 1, name: "张三", age: 25 }, { id: 2, name: "李四", age: 30 } ]; const jsonStr = JSON.stringify(userList, null, 2); console.log(jsonStr); // 输出格式与Python示例一致 -
JSON → Array(反序列化):
JSON.parse()const parsedArray = JSON.parse(jsonStr); console.log(parsedArray); // 输出:[ { id: 1, name: '张三', age: 25 }, ... ] console.log(parsedArray[0].name); // 输出:张三
Java:使用 Jackson 或 Gson 库
Java 中没有原生的 JSON 支持,通常借助第三方库(如 Jackson、Gson)实现 List 与 JSON 的转换:
-
Jackson 示例:
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; import java.util.Map; public class JsonListExample { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); // List → JSON List<Map<String, Object>> userList = List.of( Map.of("id", 1, "name", "张三", "age", 25), Map.of("id", 2, "name", "李四", "age", 30) ); String jsonStr = mapper.writeValueAsString(userList); System.out.println(jsonStr); // 输出:[{"id":1,"name":"张三","age":25},...] // JSON → List TypeReference<List<Map<String, Object>>> typeRef = new TypeReference<>() {}; List<Map<String, Object>> parsedList = mapper.readValue(jsonStr, typeRef); System.out.println(parsedList.get(0).get("name")); // 输出:张三 } } -
Gson 示例:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.util.List; import java.util.Map; public class GsonListExample { public static void main(String[] args) { Gson gson = new Gson(); // List → JSON List<Map<String, Object>> userList = List.of( Map.of("id", 1, "name", "张三", "age", 25), Map.of("id", 2, "name", "李四", "age", 30) ); String jsonStr = gson.toJson(userList); System.out.println(jsonStr); // JSON → List TypeToken<List<Map<String, Object>>> typeToken = new TypeToken<>() {}; List<Map<String, Object>> parsedList = gson.fromJson(jsonStr, typeToken.getType()); System.out.println(parsedList.get(0).get("name")); } }
特殊场景:如何表示“键值对列表”?
实际开发中,有时需要存储一组“键值对”(如配置参数、动态属性),此时有两种常见 JSON 表示方式:
方式一:对象数组(推荐)
将每个键值对表示为一个对象(包含 key 和 value 字段),整体作为数组,这种方式结构清晰,便于遍历和查找。
[
{"key": "timeout", "value": 30},
{"key": "retry_count", "value": 3},
{"key": "enable_log", "value": true}
]
方式二:单层对象(仅适用于键唯一)
如果键



还没有评论,来说两句吧...