在Python中,如何解析复杂的json文件

时间:2016-11-29 16:47:44

标签: python json

我想得到"路径"从下面的json文件;我使用json.load来获取读取的json文件,然后使用data.items()中的key,value逐个解析它导致很多for循环(Say 6循环)以获得"的值。路径&#34 ;;有没有简单的方法来检索路径的值?

可以找到完整的json文件here,下面是它的片段。

{
"products": {
    "com.ubuntu.juju:12.04:amd64": {
        "version": "2.0.1",
        "arch": "amd64",
        "versions": {
            "20161129": {
                "items": {
                    "2.0.1-precise-amd64": {
                        "release": "precise",
                        "version": "2.0.1",
                        "arch": "amd64",
                        "size": 23525972,
                        "path": "released/juju-2.0.1-precise-amd64.tgz",
                        "ftype": "tar.gz",
                        "sha256": "f548ac7b2a81d15f066674365657d3681e3d46bf797263c02e883335d24b5cda"
                    }
                }
            }
        }
    },
    "com.ubuntu.juju:14.04:amd64": {
        "version": "2.0.1",
        "arch": "amd64",
        "versions": {
            "20161129": {
                "items": {
                    "2.0.1-trusty-amd64": {
                        "release": "trusty",
                        "version": "2.0.1",
                        "arch": "amd64",
                        "size": 23526508,
                        "path": "released/juju-2.0.1-trusty-amd64.tgz",
                        "ftype": "tar.gz",
                        "sha256": "7b86875234477e7a59813bc2076a7c1b5f1d693b8e1f2691cca6643a2b0dc0a2"
                    }
                }
            }
        }
    },

5 个答案:

答案 0 :(得分:1)

您可以使用递归生成器:

mkdir($folderpath.$name);
chmod($folderpath.$name",777);

答案 1 :(得分:0)

add_role('basic_contributor', 'Basic Contributor', array( 'read' => true, // True allows that capability 'edit_posts' => true, 'delete_posts' => false, // Use false to explicitly deny )); 键始终位于加载的json中的相同深度(这是path所以)?如果是这样,那么做什么

dict

如果没有,Yevhen Kuzmovych的答案显然比我的更好,更清洁,更一般。

答案 2 :(得分:0)

如果您只关心路径,我认为使用任何JSON解析器都是一种矫枉过正,您可以使用内置的re rex并使用以下模式(\"path\":\s*\")(.*\s*)(?=\",)。我没有测试整个文件,但应该能够很容易地找出最好的模式。

答案 3 :(得分:0)

如果您只需要路径字段中的文件名,只需解析文件即可轻松获取它们:

import re

files = []
pathre = re.compile(r'\s*"path"\s*:\s*"(.*?)"')
with open('file.json') as fd:
    for line in fd:
        if "path" in line:
            m = pathre.match(line)
            if m is not None:
                files.append(m.group(1))

如果您需要同时处理pathsha256字段:

files = []
pathre = re.compile(r'\s*"path"\s*:\s*"(.*?)"')
share = re.compile(r'\s*"sha256"\s*:\s*"(.*?)"')
path = None
with open('file.json') as fd:
    for line in fd:
        if "path" in line:
            m = pathre.match(line)
            path = m.group(1)
        elif "sha256" in line:
            m = share.match(line)
            if path is not None:
                files.append((path, m.group(1)))
                path = None

答案 4 :(得分:-1)

您可以使用JSONPath之类的查询语言。在这里,您可以找到Python实现:https://pypi.python.org/pypi/jsonpath-rw

假设您已经加载了JSON内容,您可以执行以下操作:

from jsonpath_rw import jsonpath, parse

# Load your JSON content first from a file or from a string
# json_data = ...

jsonpath_expr = parse('products..path')
for match in jsonpath_expr.find(json_data):
    print(match.value)

有关进一步的讨论,请参阅:Is there a query language for JSON?