在JSON文件中找不到确切的字段

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

我有一个从crunchbase中抓取的JSON文件,并希望从该文件中打印'contact_field'
这是JSON文件中的联系人字段的示例。

"contact_fields": {
              "contact_email": "info@email.com",
              "phone_number": "+44 800 011 9688"
            },

字符串
下面的代码是查找联系人字段以打印联系人信息和电话号码

with open('html_found.json') as filter:
    data = json.load(filter)

# Find and print the specified content if it exists
if "contact_fields" in data:
    contact_fields = data["contact_fields"]
    contact_email = contact_fields.get("contact_email")
    phone_number = contact_fields.get("phone_number")

    if contact_email:
        print("Contact Email:", contact_email)
    else:
        print("Contact Email not found.")

    if phone_number:
        print("Phone Number:", phone_number)
    else:
        print("Phone Number not found.")
else:
    print("No contact fields found in the JSON data.")


输出显示“No contact field found in the json”,即使它在文件中也是如此。我在文件或线路上有什么错误吗?
下面是html_found.json中使用json beautiful


的数据

dauxcl2d

dauxcl2d1#

代码一般工作。我在之前添加了一个小的write,它将您发布到json中的内容完全写入,然后读取并解析它。你确定contact_fields本身不在列表或其他dict中,所以可以直接通过data["contract_fields"]访问它吗?请提供一个完整的json,再现你的问题,与你发布的部分没有什么错的时刻。

import json

with open('tmp.json', 'w') as f:
    f.write('{"contact_fields": {"contact_email": "info@email.com","phone_number": "+44 800 011 9688"}}')

with open('tmp.json', 'r') as f:
    data = json.load(f)

# Find and print the specified content if it exists
if "contact_fields" in data:
    contact_fields = data["contact_fields"]
    contact_email = contact_fields.get("contact_email")
    phone_number = contact_fields.get("phone_number")

    if contact_email:
        print("Contact Email:", contact_email)
    else:
        print("Contact Email not found.")

    if phone_number:
        print("Phone Number:", phone_number)
    else:
        print("Phone Number not found.")
else:
    print("No contact fields found in the JSON data.")

字符串
我的输出

Contact Email: info@email.com
Phone Number: +44 800 011 9688


编辑:根据新添加的json屏幕截图,很明显contact_fields不在json的根级别。我将假设现在发布的是您想要解析的JSON。
所以到达contact_fields的方法如下

data['HttpState']['GET/v4/data/...']['data']['cards']['contact_fields']


请注意,我没有键入GET/v4/data/...的整个键,因为它很长,所以你需要用完整的字符串替换它。
也不知道整个json有多静态,特别是HttpState下的键似乎可能会改变。所以硬编码访问可能会中断。

zengzsys

zengzsys2#

json模块将Json文件或字符串转换为列表和字典的层次结构。但是in Python操作符只研究简单dict中的键。更一般地说,Python没有提供直接的方法来递归地搜索复杂的层次结构,但是为它编写一个函数是相当简单的:

def search(data, key: str):
    """Recursively search key in an arbitrary json data"""
    def _do_search(data, key):
        """Apply search over an iterable sequence"""
        for d in data:
            newd = search(d, key)
            if newd is not None:
                return newd
        return None
    # is it a list?
    if isinstance(data, list):
        return _do_search(data, key)
    # or a dict?
    elif isinstance(data, dict):
        if key in data:  # we found the key: just return it
            return data[key]
        return _do_search(data.values(), key) # else recurse
    return None

字符串
你的代码可能会变成

with open('html_found.json') as filter:
    data = json.load(filter)

    # Find and print the specified content if it exists
    contact_fields = search(data, "contact_fields")
    if "contact_fields" is not None:
        contact_email = contact_fields.get("contact_email")
        phone_number = contact_fields.get("phone_number")
    
        if contact_email:
            print("Contact Email:", contact_email)
        else:
            print("Contact Email not found.")
    
        if phone_number:
            print("Phone Number:", phone_number)
        else:
            print("Phone Number not found.")
    else:
        print("No contact fields found in the JSON data.")

相关问题