【问题标题】:How can I navigate a JSON file that has an array in it to select the values using Objectpath in python?如何导航包含数组的 JSON 文件以在 python 中使用 Objectpath 选择值?
【发布时间】:2019-02-25 20:37:44
【问题描述】:

我有多个 JSON 文件要覆盖,但似乎无法访问下面的特定文本(干扰)。这是文件中的一行示例:

{"extracted":"high","nameid":3201932,"users":{"name":[{"ids":[28,37],"text":"distracter"}],"symbols":[]}}

以下是我编写的返回空结果的代码:

data = []
with open(fileName, 'r') as file_to_read:
    for line in file_to_read:
        data.append(json.loads(line))
        json_tree = objectpath.Tree(data)
        text_result= tuple(json_tree.execute('$.users.name[@.text]'))
return text_result

【问题讨论】:

  • name需要是嵌套数组吗?如果没有,您可以将 name 设为嵌套字典,然后访问 users.name.text

标签: python arrays json tree objectpath


【解决方案1】:

我认为这里有两个主要问题:

  1. 选择器查询似乎错误 - 我用 '$.users.name.text' 尝试过这个,发现它对我有用(使用 Python3 和 objectpath)
  2. 该函数未正确建立名称列表

试试这样的方法:

import json
import objectpath


def get_names_tree(data):
    tree = objectpath.Tree(data)
    return tuple(tree.execute('$.users.name.text'))


def load_data(file_name):
    names = []

    with open(file_name) as fh:
        for line in fh:
            data = json.loads(line)
            names.extend(get_names_tree(data))

    return names

在上面的循环中,我们建立了一个名称列表,而不是解码的实体。在您的版本中,text_result 变量被重复实例化,并且只返回最后一个。

您还可以通过使用纯 Python 方法获取数据来提高速度。

def get_names_careful(data):
    return tuple(
        name['text'] for name in
        data.get('users', {}).get('name', [])
        if 'text' in name
    )


def get_names(data):
    return tuple(name['text'] for name in data['users']['name'])

第一个注意不要因缺少数据而引发错误,但如果您知道您的数据总是正确的形状,您可以尝试第二个。

在我的测试中,它们的速度提高了 15 倍(谨慎版),而粗心版则快了 20 倍。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多