You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:31:51