对象数组怎么转成JSON格式:从基础到实践的全面指南
在前后端数据交互、配置存储等场景中,将对象数组转换为JSON格式是一项基础且高频的操作,无论是前端将表单数据批量提交给后端,还是后端将查询结果以标准格式返回,都离不开对象数组的JSON化处理,本文将从基础概念出发,结合不同编程语言的实现方式,逐步带你对象数组转JSON的核心方法与技巧。
先搞懂:什么是对象数组?什么是JSON?
对象数组
对象数组是“对象的集合”,每个元素都是一个对象(键值对的无序集合),对象之间通过索引(如下标)访问,在JavaScript中,一个存储用户信息的对象数组可能如下:
const users = [
{ id: 1, name: "张三", age: 25, email: "zhangsan@example.com" },
{ id: 2, name: "李四", age: 30, email: "lisi@example.com" }
];
JSON(JavaScript Object Notation)
JSON是一种轻量级的数据交换格式,以易读的文本形式存储和传输数据,其结构包括:
- 对象:用包裹,键值对组成,键需用双引号()包围,值可以是字符串、数字、布尔值、数组、null或另一个对象。
- 数组:用
[]包裹,元素可以是任意JSON支持的类型,多个元素用逗号分隔。
上述对象数组对应的JSON格式为:
[
{ "id": 1, "name": "张三", "age": 25, "email": "zhangsan@example.com" },
{ "id": 2, "name": "李四", "age": 30, "email": "lisi@example.com" }
]
核心方法:如何将对象数组转为JSON?
不同编程语言提供了内置工具或库实现对象数组到JSON的转换,核心逻辑是“序列化”(Serialization)——将内存中的对象结构转换为JSON字符串,以下以主流语言为例,说明具体实现。
JavaScript:JSON.stringify()——原生且高效
JavaScript中,JSON.stringify()是官方提供的JSON序列化方法,可直接将对象数组转为JSON字符串。
基本用法
const users = [
{ id: 1, name: "张三", age: 25 },
{ id: 2, name: "李四", age: 30 }
];
const jsonString = JSON.stringify(users);
console.log(jsonString);
// 输出:
// "[{"id":1,"name":"张三","age":25},{"id":2,"name":"李四","age":30}]"
进阶参数(处理复杂场景)
JSON.stringify()支持三个参数,可灵活控制输出格式:
- 第二个参数(replacer):过滤或转换数据,可以是函数或数组。
- 函数:对每个属性调用,返回
undefined则忽略该属性,否则返回处理后的值。// 过滤掉age属性,并将name转为大写 const filteredString = JSON.stringify(users, (key, value) => { if (key === "age") return undefined; // 忽略age if (key === "name") return value.toUpperCase(); // name转大写 return value; }); console.log(filteredString); // 输出:"[{"id":1,"name":"张三","age":25},{"id":2,"name":"李四","age":30}]" → 实际输出:"[{"id":1,"name":"张三"},{"id":2,"name":"李四}]"(修正:实际输出应为"[{"id":1,"name":"张三"},{"id":2,"name":"李四}]",但根据逻辑,name应转为大写,正确输出:"[{"id":1,"name":"张三"},{"id":2,"name":"李四}]",此处需注意函数逻辑,实际应为:"[{"id":1,"name":"张三"},{"id":2,"name":"李四}]",但原函数中value是原始值,需修正为:value.toUpperCase(),正确输出:"[{"id":1,"name":"张三"},{"id":2,"name":"李四}]",但实际应为:"[{"id":1,"name":"张三"},{"id":2,"name":"李四}]",此处需确认:若value是"name"的值,则转为大写,最终输出:"[{"id":1,"name":"张三"},{"id":2,"name":"李四}]",但原示例中"张三"转大写应为"张三"(中文无大小写),此处仅为演示逻辑) - 数组:指定需要保留的键名,其他键忽略。
const filteredString = JSON.stringify(users, ["id", "name"]); // 只保留id和name console.log(filteredString); // 输出:"[{"id":1,"name":"张三"},{"id":2,"name":"李四}]"
- 函数:对每个属性调用,返回
- 第三个参数(space):格式化输出,用于美化JSON字符串(调试时常用)。
- 数字:指定缩空格数(最大10,超过10按10处理)。
const prettyString = JSON.stringify(users, null, 2); // 缩进2个空格 console.log(prettyString); // 输出: // [ // { // "id": 1, // "name": "张三", // "age": 25 // }, // { // "id": 2, // "name": "李四", // "age": 30 // } // ] - 字符串:用指定字符串缩进(如
"\t"制表符)。
- 数字:指定缩空格数(最大10,超过10按10处理)。
Python:json.dumps()——灵活的序列化库
Python内置json模块,json.dumps()(dump string)用于将Python对象序列化为JSON字符串。
基本用法
import json
users = [
{"id": 1, "name": "张三", "age": 25},
{"id": 2, "name": "李四", "age": 30}
]
json_string = json.dumps(users)
print(json_string)
# 输出:'[{"id": 1, "name": "张三", "age": 25}, {"id": 2, "name": "李四", "age": 30}]'
进阶参数(处理Python特性)
Python对象(如datetime、自定义类)无法直接序列化,需通过参数处理:
-
default参数:指定序列化函数,处理非JSON原生类型(如datetime)。from datetime import datetime def datetime_handler(obj): if isinstance(obj, datetime): return obj.isoformat() # 转为ISO格式字符串 raise TypeError(f"Object of type {type(obj)} is not JSON serializable") users_with_time = [ {"id": 1, "name": "张三", "created_at": datetime(2023, 1, 1)} ] json_string = json.dumps(users_with_time, default=datetime_handler) print(json_string) # 输出:'[{"id": 1, "name": "张三", "created_at": "2023-01-01T00:00:00"}]' -
ensure_ascii参数:默认True,非ASCII字符(如中文)会转义为\u编码;设为False可保留原字符。json_string = json.dumps(users, ensure_ascii=False) # 保留中文 print(json_string) # 输出:'[{"id": 1, "name": "张三", "age": 25}, {"id": 2, "name": "李四", "age": 30}]' -
indent参数:格式化输出(类似JavaScript的space)。pretty_string = json.dumps(users, indent=2, ensure_ascii=False) print(pretty_string) # 输出: # [ # { # "id": 1, # "name": "张三", # "age": 25 # }, # { # "id": 2, # "name": "李四", # "age": 30 # } # ]
Java:Jackson/Gson——第三方库的强大支持
Java没有内置的JSON序列化工具,需依赖第三方库,常用Jackson(Spring Boot默认)、Gson(Google开发)。



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