如何使用jq/pandas转换含表头行的JSON文件?
问题描述
我有如下结构的JSON文件:
{ "data" : [ { "values" : [ "ColumnHeader1", "ColumnHeader2", "ColumnHeader3" ]}, { "values" : [ "Row1Column1", "Row1Column2", "Row1Column3" ]}, { "values" : [ "Row2Column1", "Row2Column2", "Row2Column3" ]} ] }
希望将其转换为以下结构:
{ "data": [ { "ColumnHeader1" : "Row1Column1", "ColumnHeader2": "Row1Column2", "ColumnHeader3" : "Row1Column3" }, { "ColumnHeader1" : "Row2Column1", "ColumnHeader2": "Row2Column2", "ColumnHeader3" : "Row2Column3" } ] }
我已经用Python脚本实现了这个转换,想知道能不能通过jq、pandas或者其他Unix工具/Python库完成同样的操作。
解决方案
1. 使用jq实现
jq是专门处理JSON的轻量命令行工具,一行命令即可完成转换:
jq '{data: [.data[0].values as $headers | .data[1:] | .[] | [$headers, .values] | transpose | from_entries]}' input.json
逻辑说明
- 提取第一个
values数组作为表头存入变量$headers - 筛选
data中从第二个元素开始的所有行数据 - 对每一行,将表头与当前行的
values数组转置,再转换为键值对对象 - 最后将所有对象包裹在
data数组中输出
2. 使用pandas实现
pandas擅长处理结构化数据,代码简洁直观:
import pandas as pd import json # 读取输入JSON with open('input.json', 'r') as f: raw_data = json.load(f) # 拆分表头和行数据 headers = raw_data['data'][0]['values'] row_values = [item['values'] for item in raw_data['data'][1:]] # 转换为DataFrame后生成目标格式 df = pd.DataFrame(row_values, columns=headers) result = {'data': df.to_dict('records')} # 格式化输出 print(json.dumps(result, indent=2))
3. Python原生实现(无第三方依赖)
如果不想引入额外库,纯Python也能轻松完成:
import json with open('input.json', 'r') as f: input_data = json.load(f) # 获取表头 headers = input_data['data'][0]['values'] # 遍历行数据生成键值对 output_rows = [] for row_item in input_data['data'][1:]: output_rows.append(dict(zip(headers, row_item['values']))) # 构造最终输出 output_data = {'data': output_rows} print(json.dumps(output_data, indent=2))
4. Unix工具组合(awk + json.tool)
如果必须依赖Unix原生工具链,可以用awk结合Python的json.tool来格式化输出:
awk 'BEGIN{print "{"; print " \"data\": ["} NR>2 && NR<NF{gsub(/.*\[|\].*/,""); split($0,a,/", /); if(NR==3){for(i in a) headers[i]=a[i]} else {printf " {"; for(i in headers) printf "\"%s\": \"%s\"%s", headers[i], a[i], (i==length(a)?"":", "); print "},"}} END{print " ]"; print "}"}' input.json | python -m json.tool
注:这种方式可读性较差,仅推荐在无法使用jq等工具的场景下使用
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

