循环遍历多维JSON(Python)

时间:2017-05-31 13:09:47

标签: python json list dictionary

我有一个具有以下结构的JSON:

{
    'count': 93,
    'apps' : [
        {
        'last_modified_at': '2016-10-21T12:20:26Z',
        'frequency_caps': [],
        'ios': {
            'enabled': True,
            'push_enabled': False,
            'app_store_id': 'bbb',
            'connection_type': 'certificate',
            'sdk_api_secret': '--'
        },
        'organization_id': '--',
        'name': '---',
        'app_id': 27,
        'control_group_percentage': 0,
        'created_by': {
            'user_id': 'abc',
            'user_name': 'def'
        },
        'created_at': '2016-09-28T11:41:24Z',
        'web': {}
    }, {
        'last_modified_at': '2016-10-12T08:58:57Z',
        'frequency_caps': [],
        'ios': {
            'enabled': True,
            'push_enabled': True,
            'app_store_id': '386304604',
            'connection_type': 'certificate',
            'sdk_api_secret': '---',
            'push_expiry': '2018-01-14T08:24:09Z'
        },
        'organization_id': '---',
        'name': '---',
        'app_id': 87,
        'control_group_percentage': 0,
        'created_by': {
            'user_id': '----',
            'user_name': '---'
        },
        'created_at': '2016-10-12T08:58:57Z',
        'web': {}
    }
  ]
}

这是一个带有两个键值对的JSON。第二对的值是更多JSON的列表。 对我而言,这是太多的信息,我希望有这样的JSON:

{
  'apps' : [
      {
        'name': 'Appname',
        'app_id' : 1234,
        'organization_id' : 'Blablabla'
      },
      {
        'name': 'Appname2',
        'app_id' : 5678,
        'organization_id' : 'Some other Organization'
      }
   ]
}

我想要一个只包含一个键(“apps”)及其值的JSON,它将是一个只包含三个键值对的更多JSON列表。 我很感谢任何建议。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

这可能就是你要找的东西:

import ast
import json
json_str = """{
    'count': 93,
    'apps' : [
        {
        'last_modified_at': '2016-10-21T12:20:26Z',
        'frequency_caps': [],
        'ios': {
            'enabled': True,
            'push_enabled': False,
            'app_store_id': 'bbb',
            'connection_type': 'certificate',
            'sdk_api_secret': '--'
        },
        'organization_id': '--',
        'name': '---',
        'app_id': 27,
        'control_group_percentage': 0,
        'created_by': {
            'user_id': 'abc',
            'user_name': 'def'
        },
        'created_at': '2016-09-28T11:41:24Z',
        'web': {}
    }, {
        'last_modified_at': '2016-10-12T08:58:57Z',
        'frequency_caps': [],
        'ios': {
            'enabled': True,
            'push_enabled': True,
            'app_store_id': '386304604',
            'connection_type': 'certificate',
            'sdk_api_secret': '---',
            'push_expiry': '2018-01-14T08:24:09Z'
        },
        'organization_id': '---',
        'name': '---',
        'app_id': 87,
        'control_group_percentage': 0,
        'created_by': {
            'user_id': '----',
            'user_name': '---'
        },
        'created_at': '2016-10-12T08:58:57Z',
        'web': {}
    }
  ]
}"""

json_dict = ast.literal_eval(json_str)

new_dict = {}
app_list = []

for appdata in json_dict['apps']:
    appdata_dict = {}
    appdata_dict['name'] = appdata['name']
    appdata_dict['app_id'] = appdata['app_id']
    appdata_dict['organization_id'] = appdata['organization_id']
    app_list.append(appdata_dict)

new_dict['apps'] = app_list

new_json_str = json.dumps(new_dict)

print(new_json_str) # This is your resulting json string

答案 1 :(得分:0)

@ bishakh-ghosh我认为您不需要将输入json用作字符串。它可以直接用作字典。 (因此避免ast

更简洁的方式:

# your original json
input_ = { 'count': 93, ... }

以下是步骤:

定义要保留的键

slice_keys = ['name', 'app_id', 'organization_id']

将新词典定义为slice_keys

上的切片
dict(apps=[{key:value for key,value in d.items() if key in slice_keys} for d in input_['apps']])

就是这样。

这应该产生您想要的JSON格式,例如

{
 'apps': 
    [
     {'app_id': 27, 'name': '---', 'organization_id': '--'},
     {'app_id': 87, 'name': '---', 'organization_id': '---'}
    ]
 }