【问题标题】:Build table from JSON in Python在 Python 中从 JSON 构建表
【发布时间】:2019-02-21 23:28:04
【问题描述】:

我正在尝试使用 Python 将 JSON 文本转换为标准数据表,但是我对此几乎没有经验,并且当我在线搜索解决方案时,我发现我很难实现任何解决方案。

我尝试使用ast.literal_eval,但不断收到我无法解决的错误。

raise ValueError('错误的节点或字符串:' + repr(node))

JSON:

{
    "duration": 202.0,
    "session_info": {
        "activation_uuid": "ab90d941-df9d-42c5-af81-069eb4f71515",
        "launch_uuid": "11101c41-2d79-42cc-bf6d-37be46802fc8"
    },
    "timestamp": "2019-01-18T11:11:26.135Z",
    "source_page_view_reference": {
        "page_uuid": "1bede017-7b77-461d-82ef-a6bbcfdae4d7",
        "page_id": "/group/More",
        "page_name": "More",
        "view_uuid": "9580f3c5-1116-432a-83bc-9d0b5337f661",
        "page_type": "Native"
    },
    "analytics_sdk": {
        "component_id": "datasdk",
        "component_version": "1.0.52"
    },
    "treatment_id": "mockTreat",
    "client_event_id": "2b3cd878-6932-410b-b1ad-bc40ae888fdc",
    "campaign_id": "mockCamp"
}

所需的表格格式(调整值以适合显示目的):

Duration | session_info.activation_uuid | session_info.launch_uuid | timestamp  | etc
   202.0 |  ab90d941-df9d-42c5-af81-069 | 11101c41-2d79-42cc-bf6d- | 2019-01-18 | etc

任何直接的帮助,或者只是学习这方面的好资源,我们将不胜感激。我很难找到直接与我希望从一系列类似 JSON 中创建表格的项目相关的项目。

【问题讨论】:

  • 提示:尝试学习 Pandas 进行表格操作
  • 请澄清您所说的“标准数据表”是什么意思。它是什么:a)数据库中的表(哪个?),b)python 数据结构?c)其他?
  • 这也是我要说的——特别是使用json_normalize。见pandas docs

标签: python json etl


【解决方案1】:

pandas 几乎总是在与表格交互时使用。并且可以parse a dictionary

In [0]: import pandas

In [1]: from pandas.io.json import json_normalize

In [2]: d = {'duration': 202.0,
   ...:  'session_info':
   ...:     {'activation_uuid': 'ab90d941-df9d-42c5-af81-069eb4f71515',
   ...:      'launch_uuid': '11101c41-2d79-42cc-bf6d-37be46802fc8'},
   ...:  'timestamp': '2019-01-18T11:11:26.135Z',
   ...:  'source_page_view_reference':
   ...:     {'page_uuid': '1bede017-7b77-461d-82ef-a6bbcfdae4d7',
   ...:      'page_id': '/group/More',
   ...:      'page_name': 'More',
   ...:      'view_uuid': '9580f3c5-1116-432a-83bc-9d0b5337f661',
   ...:      'page_type': 'Native'},
   ...:  'analytics_sdk':
   ...:     {'component_id': 'datasdk',
   ...:      'component_version': '1.0.52'},
   ...:  'treatment_id': 'mockTreat',
   ...:  'client_event_id': '2b3cd878-6932-410b-b1ad-bc40ae888fdc',
   ...:  'campaign_id': 'mockCamp'}

In [4]: json_normalize(d)
Out[4]:
  analytics_sdk.component_id analytics_sdk.component_version campaign_id                       client_event_id  duration  ... source_page_view_reference.page_type  source_page_view_reference.page_uuid  source_page_view_reference.view_uuid                 timestamp treatment_id
0                    datasdk                          1.0.52    mockCamp  2b3cd878-6932-410b-b1ad-bc40ae888fdc     202.0  ...                               Native  1bede017-7b77-461d-82ef-a6bbcfdae4d7  9580f3c5-1116-432a-83bc-9d0b5337f661  2019-01-18T11:11:26.135Z    mockTreat

[1 rows x 14 columns]

要将 JSON 字符串加载到字典中,请使用 json.loads

或使用pandas.read_json

【讨论】:

    【解决方案2】:

    你也可以通过下面的方式来做,类似于pandas内部做的事情。

    import json
    
    jsondata='''{
        "duration": 202.0,
        "session_info": {
            "activation_uuid": "ab90d941-df9d-42c5-af81-069eb4f71515",
            "launch_uuid": "11101c41-2d79-42cc-bf6d-37be46802fc8"
        },
        "timestamp": "2019-01-18T11:11:26.135Z",
        "source_page_view_reference": {
            "page_uuid": "1bede017-7b77-461d-82ef-a6bbcfdae4d7",
            "page_id": "/group/More",
            "page_name": "More",
            "view_uuid": "9580f3c5-1116-432a-83bc-9d0b5337f661",
            "page_type": "Native"
        },
        "analytics_sdk": {
            "component_id": "datasdk",
            "component_version": "1.0.52"
        },
        "treatment_id": "mockTreat",
        "client_event_id": "2b3cd878-6932-410b-b1ad-bc40ae888fdc",
        "campaign_id": "mockCamp"
    }'''
    
    data=json.loads(jsondata)
    
    table=[[],[]]
    def dictList(d, column_name=''):
        for k, v in d.items():
            if isinstance(v, dict):
                dictList(v, column_name=k)
                continue
            if column_name:
                column_name+='.'
            column_name +=k
            table[0].append(column_name)
            table[1].append(v)
    
    dictList(data)
    
    for row in table:
        print (row)
    

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 2022-07-06
      相关资源
      最近更新 更多