如何处理一个JSON文件,使其每个项目只包含4个字段?

vs91vp4v  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(91)

这就是我的JSON文件的样子:

[
    {
        "id": 13445,
        "uuid": "bf1923c5-a198-409b-851e-c67f7b8a661e",
        "created_at": "2021-07-27 12:41:31.715922",
        "updated_at": "2021-11-10 21:41:41.857982",
        "meta": {
            "osm_id": null,
            "google_maps_place_id": "ChIJO4sAE5d-1EARsPwZh_s6eX4"
        },
        "type": "VILLAGE",
        "name": {
            "en": "Dіbrіvka",
            "ru": "Дибривка",
            "uk": "Дібрівка"
        },
        "public_name": {
            "en": "village Dіbrіvka",
            "ru": "п. Дибривка",
            "uk": "с. Дібрівка"
        },
        "post_code": [
            "09226"
        ],
        "katottg": "UA32120130090047792",
        "koatuu": "3222281602",
        "lng": 30.9903521,
        "lat": 49.88724620000001,
        "parent_id": 1051
    }
]

字符串
使用以下代码,我可以读取JSON并将其转换为Python dict

with open('ua_locations.json', 'r',  encoding="utf-8") as user_file:
    file_contents = user_file.read()
    json_object = json.loads(file_contents)[0]

print(type(json_object))
print(json_object['id']['public_name']['lng']['lat'])


我如何只包含4个字段:id,public name,lng,lat为list中的每个元素?

apeeds0o

apeeds0o1#

创建您感兴趣的键的列表(或元组)。然后,您可以在列表解析中合并字典解析,如下所示:

import json

INPUT_FILE = '/Volumes/G-Drive/ua_locations.json'
KEYS = ('id', 'public_name', 'lng', 'lat')

with open(INPUT_FILE) as j:
    for d in [{k: item.get(k) for k in KEYS} for item in json.load(j)]:
        print(d)

字符串

输出:

{'id': 13445, 'public_name': {'en': 'village Dіbrіvka', 'ru': 'п. Дибривка', 'uk': 'с. Дібрівка'}, 'lng': 30.9903521, 'lat': 49.88724620000001}

z3yyvxxp

z3yyvxxp2#

你在你的例子中链接了键,这不是你所期望的。
你没有按顺序获取同一个对象的键,你的例子只有在对象是一个嵌套字典时才有效,该字典具有以下结构:

d = {'id': {'public_name': {'lng': {'lat': 42}}}}

字符串
JSON格式:

{
    "id": {
        "public_name": {
            "lng": {
                "lat": 42
            }
        }
    }
}


d['id']['public_name']['lng']['lat']表示从左向右遍历,从当前对象中获取与当前键关联的值,并将该值赋给当前对象。结果是42。
如果你想要这些字段,你需要像这样查询同一个对象的字段:

(d['id'], d['public_name'], d['lng'], d['lat'])


这将获取字段值,但省略字段名。
要获取字段名称和值,请使用以下解析之一:

{k: v for k, v in d.items() if k in {'id', 'public_name', 'lng', 'lat'}}


或者是

{k: d[k] for k in ['id', 'public_name', 'lng', 'lat']}


第一个保留键在字典中出现的顺序,第二个保证所有项具有相同的字段顺序,但第二个只有在所有字段都存在时才能工作。
你的顶层数据是一个list,它不支持使用字符串作为索引,如果你想对一个元素应用上面的操作,使用索引来获取元素并像这样应用操作:

d = json_object[0]
print({k: d[k] for k in ['id', 'public_name', 'lng', 'lat']})


第一个对象使用0,第二个对象使用1,以此类推。
您可以定义一个函数来重用相同的代码:

def filter_fields(d):
    return {k: d[k] for k in ['id', 'public_name', 'lng', 'lat']}


最后,要将转换应用于列表的所有元素,请使用列表解析:

import json

with open('ua_locations.json', 'r',  encoding='utf8') as f:
    file = f.read()

data = json.loads(file)

[{k: e[k] for k in ['id', 'public_name', 'lng', 'lat']} for e in data]

相关问题