将嵌套json(mixpanel api原始数据导出)转换为CSV?(最好使用Python)

将嵌套json(mixpanel api原始数据导出)转换为CSV?(最好使用Python),python,json,excel,csv,mixpanel,Python,Json,Excel,Csv,Mixpanel,我已经从Mixpanel API收到了原始数据。我希望将其转换为CSV文件,以便在Excel中处理数据。我尝试过这个在线工具(),但它似乎无法处理嵌套的json结果。最好的方法是什么 以下是示例输出: {"event":"Event.Name","properties":{"time":1376784014,"distinct_id":"distinctID","$app_version":"1.XX","$city":"cityName","$ios_ifa":"iosIfa","$lib_v

我已经从Mixpanel API收到了原始数据。我希望将其转换为CSV文件,以便在Excel中处理数据。我尝试过这个在线工具(),但它似乎无法处理嵌套的json结果。最好的方法是什么

以下是示例输出:

{"event":"Event.Name","properties":{"time":1376784014,"distinct_id":"distinctID","$app_version":"1.XX","$city":"cityName","$ios_ifa":"iosIfa","$lib_version":"X.Y.Z","$manufacturer":"Apple","$model":"model","$os":"iPhone OS","$os_version":"X.Y.Z","$region":"Region","$screen_height":999,"$screen_width":999,"$wifi":true,"App Version":"1.XX","BattleDuration":"99","BattleNum":"2","Episode Num":"2","PlayerVictory":"1","mp_country_code":"CODE","mp_device_model":"Model","mp_lib":"iphone"}}

您可以尝试下面给出的示例代码。您可以使用递归函数获取键和值(您必须以某种方式确保保持顺序)


我猜这只是你可能要处理的众多记录之一。基本上,您需要将JSON对象转换为更平坦的对象而不嵌套,同时不丢失键及其关系

这个

{
    "event":"Event.Name",
    "properties":{
        "time":1376784014,
        "distinct_id":"distinctID",
    ....
    ....
}
可以转换为。。。(您可以用任何其他分隔符替换uu)

然后,您可以使用csv.DictWriter将此结构写入csv文件

您可以使用这样的递归函数

def reduce_item(key, value):
    global reduced_item

    #Reduction Condition 1
    if type(value) is list:
        i=0
        for sub_item in value:
            reduce_item(key+'_'+str(i), sub_item)
            i=i+1

    #Reduction Condition 2
    elif type(value) is dict:
        sub_keys = value.keys()
        for sub_key in sub_keys:
            reduce_item(key+'_'+str(sub_key), value[sub_key])

    #Base Condition
    else:
        reduced_item[str(key)] = str(value)
然后你可以像这样调用这个函数

raw_data = json.loads("your_json_string")
reduced_item = {}
reduce_item("mixpanel", raw_data)
我已经写了一个脚本来做这件事。您可以在上查看完整的代码。可以找到详细的解释

def reduce_item(key, value):
    global reduced_item

    #Reduction Condition 1
    if type(value) is list:
        i=0
        for sub_item in value:
            reduce_item(key+'_'+str(i), sub_item)
            i=i+1

    #Reduction Condition 2
    elif type(value) is dict:
        sub_keys = value.keys()
        for sub_key in sub_keys:
            reduce_item(key+'_'+str(sub_key), value[sub_key])

    #Base Condition
    else:
        reduced_item[str(key)] = str(value)
raw_data = json.loads("your_json_string")
reduced_item = {}
reduce_item("mixpanel", raw_data)