【问题标题】:How to search for Keywords in JSON如何在 JSON 中搜索关键字
【发布时间】:2021-07-26 15:29:48
【问题描述】:

我正在使用 python json,我想让我的 Python 代码在 JSON 文件中搜索特定关键字。

基本上它应该搜索“个人资料名称”,然后向下一行打印个人资料的电子邮件。

[
  {
    "profilename": "Test123"
    "email": "reid.warren@undefined.name",
    "phone": "+1 (983) 443-3504",
    "address": "359 Rapelye Street, Holtville, Marshall Islands, 9692"
  },
  {
    "profilename": "QTest123"
    "email": "amelia.wilkinson@undefined.us",
    "phone": "+1 (831) 563-3240",
    "address": "525 Allen Avenue, Iola, Kentucky, 894"
  }
]

就像代码应该搜索 profilename "Test123" 并打印出它的电子邮件,就像向下一行打印出电子邮件一样。

我尝试了很多东西,但我什至没有更近一步,所以分享我当前的代码将有助于 0 :/

谢谢。

【问题讨论】:

  • “分享我当前的代码会有所帮助”,是的,这样做

标签: python json string python-jsons


【解决方案1】:

如果我理解正确,您正试图通过字段profilename 查找个人资料并返回用户的email

profiles = [
    {
        "profilename": "Test123",
        "email": "reid.warren@undefined.name",
        "phone": "+1 (983) 443-3504",
        "address": "359 Rapelye Street, Holtville, Marshall Islands, 9692",
    },
    {
        "profilename": "QTest123",
        "email": "amelia.wilkinson@undefined.us",
        "phone": "+1 (831) 563-3240",
        "address": "525 Allen Avenue, Iola, Kentucky, 894",
    },
]


def get_profile_email(profilename):
    profile = next(
        (item for item in profiles if item["profilename"] == profilename), None
    )
    if profile:
        return profile["email"]
    return None

print(get_profile_email("Test123"))

输出: reid.warren@undefined.name

从文件加载配置文件:

import json

with open("profiles.json", "r") as f:
    profiles = json.loads(f.read())

【讨论】:

  • next 的第二个参数如果你不提供,默认为None,不是吗?
  • 不,如果没有第二个参数,如果找不到匹配项,则会引发 StopIteration 异常。来自文档:“如果给出默认值并且迭代器已用尽,则返回它而不是引发 StopIteration。”
  • 哦,好的。感谢您的澄清。
  • 是的,这就是我想知道的,谢谢!还有一个问题,是否也可以打开 JSON 文件?就像将所有信息保存到单独的 JSON 文件中一样,而 .py 文件中没有信息?这样它就可以从单独的 JSON 文件中读取信息
  • 我添加了有关如何从单独文件加载 json 的示例代码。此代码假定您将数据保存在当前目录中名为 profiles.json 的文件中。
【解决方案2】:
  1. 将数据反序列化为 python 对象(本例中为字典列表):
import json

json_str = '''[
  {
    "profilename": "Test123",
    "email": "reid.warren@undefined.name",
    "phone": "+1 (983) 443-3504",
    "address": "359 Rapelye Street, Holtville, Marshall Islands, 9692"
  },
  {
    "profilename": "QTest123",
    "email": "amelia.wilkinson@undefined.us",
    "phone": "+1 (831) 563-3240",
    "address": "525 Allen Avenue, Iola, Kentucky, 894"
  }
]'''

list_of_dicts = json.loads(json_str)
  1. 然后找到并打印出您的条目:
profile_entry = next(el for el in list_of_dicts if el['profilename'] == 'Test123')
print(profile_entry['email'])

StopIteration 在您的数据中没有 profilename == Test123 时出现。更多词典列表搜索here

【讨论】:

  • 如果您打算重新引发异常而不对其进行任何操作,则可以删除 try .. except ... 语句。
【解决方案3】:
import json

json = [
  {
    "profilename": "Test123",
    "email": "reid.warren@undefined.name",
    "phone": "+1 (983) 443-3504",
    "address": "359 Rapelye Street, Holtville, Marshall Islands, 9692"
  },
  {
    "profilename": "QTest123",
    "email": "amelia.wilkinson@undefined.us",
    "phone": "+1 (831) 563-3240",
    "address": "525 Allen Avenue, Iola, Kentucky, 894"
  }
]
profile_name =  "Test123"
data = [x for x in json if x['profilename'] in profile_name]
print(data[0]['email'])
>>>reid.warren@undefined.name

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 2017-02-18
    • 2014-12-08
    • 2021-11-01
    • 1970-01-01
    • 2020-12-05
    • 2010-10-20
    • 2021-03-15
    相关资源
    最近更新 更多