Python3JSON按值而不是索引选择?

2024-05-29 05:50:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个JSON文件中有一些数据,我正试图操作它。我之前没有对JSON做过很多工作,我想知道是否可以通过它的一个值而不是索引来选择一个对象。在

以下是我的json文件:

{"device":[
    {"id": 0, "name": "iPhone 6", "width": 750, "height": 1334},
    {"id": 1, "name": "iPhone 6 Plus", "width": 1242, "height": 2208},
    {"id": 2, "name": "Galaxy S6", "width": 1440, "height": 2560}
]}

我想选择id = 0的对象并打印出name值。我意识到,典型的方法是通过对象的索引值来选择对象,在本例中,索引值与id值相匹配,这意味着我会做如下操作:

^{pr2}$

这将打印出名称,但它依赖于索引等于id,在理想情况下,id就是这样。也许更好的方法是将索引作为id并完全删除该字段,这样就不会产生混淆?在我看来,这似乎是一个重复的索引,虽然它的存在使我可以在我的数据库中存储一个ID,并在JSON文件中独立地编辑name,但是它有一些具体的东西来表示顺序(即,有人可能会在文件的顶部添加一个设备,从而移动其他设备的索引,从而破坏整个系统)。我觉得我在寻找错误的数据结构,而且没有办法按照以下思路来做:

print(json_obj['device'][id = 0]['name']

我说得对吗?在


Tags: 文件数据对象方法nameidjsondevice
3条回答

没有什么比这更有效的了,但是你可以做一些类似的事情:

[x['name'] for x in json_obj['device'] if x['id'] == 0][0]

它生成一个id==0的所有元素的列表。在id not found的情况下更难处理。在

从设计的角度来看,如果您可以控制数据的来源,或者您可能想要处理它,则更像是:

^{pr2}$

如果你没有控制权,你可以通过:

json_obj['device'] = dict(zip([x['id'] for x in json_obj['device']), json_obj['device'])
json_obj['device'][id]['name']

在实践中,您可能不只是想覆盖现有的变量,而是通过这种方式保持所有其他变量不变。在

当然有很多简单的方法可以做到这一点。在

data = {
    "device": [
        {"id": 0, "name": "iPhone 6", "width": 750, "height": 1334},
        {"id": 1, "name": "iPhone 6 Plus", "width": 1242, "height": 2208},
        {"id": 2, "name": "Galaxy S6", "width": 1440, "height": 2560}
    ]
}

items = data.get('device')
for item in items:
    if item.get('id') == 0:
        print(item.get('name'))

小提示:这与JSON没有任何关系。一旦解析了数据,它就不再是JSON,而是内存中的常规数据(列表、字符串、字典等)

一种简单的方法是使用循环:

for device in data['device']:
    if device['id'] == 5:
        print('Device:', device['name'])
        break
else:
    print('No such device')

您也可以通过理解或其他复杂(和简洁)的方法来实现这一点,但上面的方法可能更直接和简单。在

还有一个名为JSONPath(其Python module)的系统可以让您以更具声明性和更自然的方式表达查询。在

相关问题 更多 >

    热门问题