什么格式能转成JSON?一份全面的格式转换指南
在数据交互、API开发、配置管理等场景中,JSON(JavaScript Object Notation)因其轻量、易读、机器友好等特性,已成为主流的数据交换格式,实际工作中我们常遇到各种非JSON格式的数据,如何将它们转换为JSON?本文将梳理常见可转JSON的格式、转换方法及注意事项,助你轻松应对数据转换需求。
什么是JSON?为什么需要转换?
JSON是一种基于文本的数据格式,采用“键值对”(Key-Value)的形式组织数据,结构清晰,易于人类阅读和机器解析,其核心语法包括:
- 对象(Object):用 包裹,键值对以
key: value形式存在,键需加双引号,值可以是字符串、数字、布尔值、数组、对象或null,多个键值对用逗号分隔。 - 数组(Array):用
[]包裹,元素可以是任意JSON数据类型,多个元素用逗号分隔。
常见的需转JSON的格式包括CSV、XML、YAML、Excel、数据库查询结果、HTML表格等,这些格式在不同场景下有各自的优势,但跨系统交互时往往需要统一为JSON格式。
常见可转JSON的格式及转换方法
CSV(逗号分隔值)
特点:以逗号分隔字段的纯文本格式,常用于表格数据存储,Excel、数据库导出等场景均支持。
转换方法:
-
编程语言转换:通过代码解析CSV的行列结构,将表头作为JSON对象的键,每行数据作为对应的值。
-
Python示例(使用
csv和json库):import csv import json with open('data.csv', 'r', encoding='utf-8') as csv_file: csv_reader = csv.DictReader(csv_file) # 以表头作为键 json_data = [row for row in csv_reader] # 转换为字典列表 with open('data.json', 'w', encoding='utf-8') as json_file: json.dump(json_data, json_file, ensure_ascii=False, indent=4) -
JavaScript示例(使用
Papa Parse库):Papa.parse("name,age\nAlice,25\nBob,30", { header: true, complete: function(results) { console.log(JSON.stringify(results.data, null, 2)); // 输出JSON } });
-
-
在线工具转换:如ConvertCSV、JSON Formatter等网站支持直接上传CSV文件并导出JSON。
XML(可扩展标记语言)
特点:标签式结构化语言,常用于配置文件、Web服务(如SOAP)等场景,支持嵌套层级关系。
转换方法:
-
编程语言转换:将XML的标签映射为JSON的键,嵌套标签转为嵌套对象,属性转为键值对。
-
Python示例(使用
xmltodict库):import xmltodict import json xml_data = """ <root> <person id="1"> <name>Alice</name> <age>25</age> </person> <person id="2"> <name>Bob</name> <age>30</age> </person> </root> """ dict_data = xmltodict.parse(xml_data) # 转为字典 json_data = json.dumps(dict_data, indent=4) print(json_data)输出结果:
{ "root": { "person": [ { "@id": "1", "name": "Alice", "age": "25" }, { "@id": "2", "name": "Bob", "age": "30" } ] } } -
JavaScript示例(使用
xml2js库):const xml2js = require('xml2js'); const parser = new xml2js.Parser(); const xmlData = `<root><person><name>Alice</name></person></root>`; parser.parseString(xmlData, (err, result) => { console.log(JSON.stringify(result, null, 2)); });
-
-
命令行工具:
xsltproc或yq(需安装)支持XML转JSON,例如yq -p=xml -o=json input.xml > output.json。
YAML(YAML Ain't Markup Language)
特点:以缩进表示层级关系的纯文本格式,比JSON更易读,常用于配置文件(如Docker、Kubernetes)。
转换方法:
-
编程语言转换:YAML可直接转为Python字典或JavaScript对象,再序列化为JSON。
-
Python示例(使用
PyYAML库):import yaml import json yaml_data = """ - name: Alice age: 25 - name: Bob age: 30 """ dict_data = yaml.safe_load(yaml_data) # 转为字典 json_data = json.dumps(dict_data, indent=4) print(json_data)
输出结果:
[ { "name": "Alice", "age": 25 }, { "name": "Bob", "age": 30 } ] -
命令行工具:
yq支持YAML与JSON互转,例如yq -p=yaml -o=json input.yaml > output.json。
-
Excel(.xlsx/.xls)
特点:电子表格文件,包含多张工作表,常用于业务数据存储,需通过工具解析单元格数据。
转换方法:
-
编程语言转换:读取Excel的行列数据,将表头作为键,每行数据转为JSON对象。
-
Python示例(使用
pandas库):import pandas as pd import json df = pd.read_excel('data.xlsx') # 读取Excel json_data = df.to_json(orient='records', force_ascii=False, indent=4) # 转为JSON数组 print(json_data) -
JavaScript示例(使用
xlsx库):const XLSX = require('xlsx'); const workbook = XLSX.readFile('data.xlsx'); const sheetName = workbook.SheetNames[0]; const sheet = workbook.Sheets[sheetName]; const json_data = XLSX.utils.sheet_to_json(sheet); console.log(JSON.stringify(json_data, null, 2));
-
-
在线工具:如Convertio、Zamzar等支持上传Excel文件并导出JSON。
数据库查询结果(MySQL、PostgreSQL等)
特点:数据库查询返回的结构化数据(如表格形式),需通过数据库驱动或ORM工具获取后转换。
转换方法:
-
Python示例(使用
pymysql+pandas):import pymysql import pandas as pd import json conn = pymysql.connect(host='localhost', user='root', password='123456', db='test') df = pd.read_sql('SELECT * FROM users', conn) # 执行查询并转为DataFrame json_data = df.to_json(orient='records', indent=4) conn.close() print(json_data) -
命令行工具:
mysqlsh(MySQL Shell)支持查询结果直接输出JSON,例如\sql SELECT * FROM users\G(\G格式化输出,需配合脚本处理)。
HTML表格
特点:网页中的<table>标签结构,常用于爬取网页数据或解析静态表格。
转换方法:
-
编程语言转换:解析HTML的
<tr>(行)、<td>(单元格)、<th>(表头)标签,构建JSON结构。-
Python示例(使用
BeautifulSoup库):from bs4 import BeautifulSoup import json html = """ <table> <tr><th>Name</th><th>Age</th></tr> <tr><td>Alice</td><td>25</td></tr> <tr><td>Bob</td><td>30</td></tr> </table> """ soup = BeautifulSoup(html, 'html.parser') headers = [th.text for th in soup.find('tr').find_all('th')] rows = [] for tr in soup.find_all('tr')[1:]:
-



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