如何将指定格式的CSV文件转换为含filters层级且name嵌套在details中的JSON结构?
如何将指定格式的CSV文件转换为含filters层级且name嵌套在details中的JSON结构?
嗨,我来帮你搞定这个CSV转JSON的需求!你想要的是给最终输出加一个外层的filters数组,还得把name字段嵌套到details子对象里,对吧?
先回顾下你的输入CSV内容:
ID,item,name 1,A,aname 2,A,bname 6,A,zname 8,A,xname
以及期望的JSON结构:
{ "filters": [ { "ID": "1", "item": "A", "details": { "name": "aname" } }, { "ID": "2", "item": "A", "details": { "name": "bname" } }, { "ID": "6", "item": "A", "details": { "name": "zname" } }, { "ID": "8", "item": "A", "details": { "name": "xname" } } ] }
你之前的命令只是把CSV每行直接转成了字典列表,没处理嵌套结构和外层的filters键。咱们稍微修改一下Python代码就能实现需求,直接用这条命令就行:
cat /tmp/input.csv | python -c 'import csv, json, sys; rows = []; for r in csv.DictReader(sys.stdin): rows.append({"ID": r["ID"], "item": r["item"], "details": {"name": r["name"]}}); print(json.dumps({"filters": rows}, indent=2))'
我给你拆解下这段代码的逻辑:
- 用
csv.DictReader读取标准输入的CSV内容,每一行都会变成一个键值对字典 - 遍历每一行字典,手动构造我们需要的结构:保留
ID和item字段,把name放到details这个子对象里 - 把所有构造好的对象收集到
rows列表中 - 最后把
rows作为filters键对应的值,用json.dumps转成JSON字符串,indent=2是为了让输出的JSON更美观易读,要是不需要格式化可以去掉这个参数
运行这条命令后,就能得到你想要的JSON结构啦。如果之后CSV里新增了需要放到details里的字段,只要在details的字典里加上对应的键值对就行,比如"details": {"name": r["name"], "price": r["price"]}这样。
内容来源于stack exchange
相关产品推荐
相关产品推荐

