我有一个需求,就是将 mongo 的结果通过 python 转换成 csv,但是遇到这类数据结构就不知道怎么处理:
{
"_id": xxxxzx
“ uid ”: 1378914,
 "User":[
{
'0':{"is_pay": true,
  "product": "清洁器"
},
'1':{"is_pay": true,
  "product": "大彩电"
}
}
],
“ is_VIP ”: "",
"last_time": ISODate("xxxxxx")
"history": ["xxxx", "xxxx"]
}
有什么办法能将内嵌的字段的 jkey 转化成CSV header, 将 list 里面的 value 转换成“ xxx, xxx ”呢?
|      1golmic      2017-11-25 20:56:13 +08:00 via Android 额。。这不是很简单么。。你用 python 写个 for 循环 | 
|  |      2scriptB0y      2017-11-25 21:01:27 +08:00 用内置的 csv 模块 for 循环输出 | 
|  |      3SlipStupig OP | 
|  |      4janxin      2017-11-26 05:09:23 +08:00 via iPhone @SlipStupig 那就遍历两遍… | 
|      5faketemp      2017-11-26 08:23:09 +08:00  1 | 
|  |      7SlipStupig OP | 
|  |      8janxin      2017-11-26 13:28:05 +08:00 @SlipStupig 第一遍取完所有的 key,第二遍填内容,怎么可能不可以? | 
|  |      9SlipStupig OP @janxin 当然不行,如果是内嵌的话, 例如: { “ User ”:[ "0":{"is_pay": true, "product": "清洁器" }, "1":{"is_pay": true, "product": "大彩电" }] } 这里面有三层,你一次根本弄不完 | 
|  |      10janxin      2017-11-26 14:26:13 +08:00 @SlipStupig 为什么取不完... | 
|  |      11SlipStupig OP @janxin show your code | 
|  |      12allen0125      2017-11-26 20:03:44 +08:00 同样需求的表示持续关注 | 
|  |      13yb3712590      2017-11-27 02:22:12 +08:00 keys=set() for key in a.keys(): ....keys.add(key) for goods in a['User']: ....for good in goods.values(): ........for key in good.keys(): ............keys.add(key) 有了 json 的所有 keys 之后,你再根据这些 key 去找对应的数据填充,User list 有几个成员最后就会产生几行 | 
|  |      14SlipStupig OP @yb3712590 感謝你的回答,但是我这个不是一个好主意,因为如果内嵌更多数据后,依然无法全部解压出来,需要写更多的 for 循环 | 
|  |      15SlipStupig OP @allen0125  我用的方法,先将 JSON 转成 python dict,然后扁平化,最后用 tablib 去处理。 扁平化代码: def flatten_json(maps, delimiter): """ flatten the Map object :param maps: the map object :param delimiter: the delimiter symbols :return: A new dict object """ val = {} for i in maps.keys(): if isinstance(maps[i], dict): get = flatten_json(maps[i], delimiter) for j in get.keys(): val[i + delimiter + j] = get[j] elif isinstance(maps[i], (tuple, list)): if maps[i]: for item_seq in xrange(len(maps[i])): item = maps[i][item_seq] if not item: continue elif isinstance(item, (str, unicode)): val[i] = ';'.join(maps[i]) break elif isinstance(item, dict): for j in item.keys(): val[i + delimiter + j+':'+str(item_seq)] = item[j] else: val[i] = None else: val[i] = maps[i] return val | 
|  |      16levelworm      2020-07-29 01:48:52 +08:00 via Android 需要所有的 key 么?如果有固定列表就好了,不过看了下评论好像没有。 |