JSON数据转换全指南:从基础到实践的全面解析
JSON数据转换的核心概念与常见场景
JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁、易读、易解析的特性,已成为前后端开发、API接口、配置文件等场景中的“数据通用语言”,但实际应用中,不同系统、语言或需求往往需要对JSON数据进行“转换”——无论是改变数据结构、适配目标格式,还是优化存储效率,转换都是数据处理的关键环节。
常见的JSON数据转换场景包括:
- 跨语言交互:如后端Java生成的JSON数据需被前端JavaScript解析,或Python读取的JSON需转换为Java对象;
- 数据格式适配:如将JSON转换为XML、CSV或数据库表结构,以满足特定工具或系统的输入要求;
- 数据结构重构:如扁平化嵌套JSON、提取字段、过滤冗余数据,以简化后续处理;
- 类型转换:如JSON中的字符串类型数字转换为数值类型,或日期字符串转换为时间对象。
JSON数据转换的核心方向与方法
JSON数据转换的核心可归纳为三大方向:JSON与其他格式互转、JSON数据结构转换、JSON数据类型转换,以下是各方向的详细实践方法。
(一)JSON与其他数据格式的转换
JSON转字符串(序列化)
JSON数据的本质是字符串、数字、布尔值、数组、对象的组合,但很多场景下需要将其转换为“字符串”形式(如存储到文本文件、通过网络传输),这一过程称为“序列化”(Serialization)。
-
JavaScript/TypeScript:使用
JSON.stringify()方法。const data = { name: "张三", age: 25, hobbies: ["reading", "coding"] }; const jsonString = JSON.stringify(data); // 输出: '{"name":"张三","age":25,"hobbies":["reading","coding"]}'可通过第二个参数(过滤器)和第三个参数(格式化缩进)优化输出,如
JSON.stringify(data, null, 2)可生成格式化的JSON字符串。 -
Python:使用
json模块的dumps()函数。import json data = {"name": "张三", "age": 25, "hobbies": ["reading", "coding"]} json_str = json.dumps(data, ensure_ascii=False, indent=2) # ensure_ascii=False支持中文,indent=2格式化输出 -
Java:使用
Jackson或Gson库(需添加依赖),以Jackson为例:import com.fasterxml.jackson.databind.ObjectMapper; public class Main { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper(); Data data = new Data("张三", 25, Arrays.asList("reading", "coding")); String jsonStr = mapper.writeValueAsString(data); System.out.println(jsonStr); // 输出JSON字符串 } } class Data { // 对应JSON结构的Java类 private String name; private int age; private List<String> hobbies; // 构造方法、getter/setter省略 }
字符串转JSON(反序列化)
将JSON格式的字符串解析为编程语言中的原生对象(如JavaScript的Object、Python的dict、Java的Bean对象),称为“反序列化”(Deserialization)。
-
JavaScript/TypeScript:使用
JSON.parse()方法。const jsonString = '{"name":"张三","age":25,"hobbies":["reading","coding"]}'; const data = JSON.parse(jsonString); console.log(data.name); // 输出: 张三 -
Python:使用
json模块的loads()函数。import json json_str = '{"name": "张三", "age": 25, "hobbies": ["reading", "coding"]}' data = json.loads(json_str) print(data["name"]) # 输出: 张三 -
Java:使用Jackson的
readValue()方法。ObjectMapper mapper = new ObjectMapper(); String jsonStr = "{\"name\":\"张三\",\"age\":25,\"hobbies\":[\"reading\",\"coding\"]}"; Data data = mapper.readValue(jsonStr, Data.class); System.out.println(data.getName()); // 输出: 张三
JSON与XML/CSV的互转
-
JSON转XML:可通过第三方工具库实现,如Python的
dicttoxml库:from dicttoxml import dicttoxml json_data = {"root": {"name": "张三", "age": 25}} xml_data = dicttoxml(json_data, custom_root="data") print(xml_data.decode()) # 输出XML格式字符串或使用JavaScript的
xml2js库(需安装npm install xml2js)进行双向转换。 -
JSON转CSV:适用于表格型数据(如数组对象),如Python的
pandas库:import pandas as pd json_data = [{"name": "张三", "age": 25}, {"name": "李四", "age": 30}] df = pd.DataFrame(json_data) df.to_csv("data.csv", index=False) # 保存为CSV文件
(二)JSON数据结构的转换
实际业务中,JSON数据常因嵌套过深、字段冗余等问题需要重构,常见操作包括:
扁平化嵌套JSON
将多层嵌套的JSON转换为单层结构(如{"user": {"name": "张三"}} → {"user_name": "张三"})。
-
Python实现:递归遍历字典,拼接键名:
def flatten_json(y): out = {} def flatten(x, name=""): if type(x) is dict: for a in x: flatten(x[a], name + a + "_") elif type(x) is list: for i, a in enumerate(x): flatten(a, name + str(i) + "_") else: out[name[:-1]] = x flatten(y) return out nested_json = {"user": {"name": "张三", "contact": {"email": "zhangsan@example.com"}}} flattened = flatten_json(nested_json) print(flattened) # 输出: {'user_name': '张三', 'user_contact_email': 'zhangsan@example.com'} -
JavaScript实现:使用递归或第三方库(如
flat)。
提取/过滤字段
从JSON中提取特定字段,或过滤掉不需要的数据。
-
JavaScript:使用
Array.prototype.map()或Object.keys():const users = [ {id: 1, name: "张三", age: 25}, {id: 2, name: "李四", age: 30} ]; const names = users.map(user => user.name); // 提取name字段 const adults = users.filter(user => user.age >= 25); // 过滤成年人 -
Python:使用列表推导式或
pandas:users = [{"id": 1, "name": "张三", "age": 25}, {"id": 2, "name": "李四", "age": 30}] names = [user["name"] for user in users] # 提取name adults = [user for user in users if user["age"] >= 25] # 过滤
合并/拆分JSON
-
合并:将多个JSON对象合并为一个(如合并用户信息与订单信息)。
const user = {id: 1, name: "张三"}; const order = {orderId: "A001", amount: 100}; const merged = {...user, ...order}; // 合并对象 -
拆分:将一个大JSON按拆分为多个小JSON(如按日期拆分日志数据)。
import json data = {"logs": [{"date": "2023-01-01", "msg": "error"}, {"date": "2023-01-02", "msg": "info"}]} split_data = {log["date"]: log["msg"] for log in data["logs"]} # 按日期拆分
(三)JSON数据类型的转换
JSON原生支持6种数据类型:字符串、数字、布尔值、null、数组、对象,但实际场景中常需转换类型(如字符串数字转为整数、日期字符串转为时间对象)。
基本类型转换
- 字符串→数字



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