Mam plik JSON z wieloma słownikami strukturą w nim jako pokaż poniżej.

[
    {
        "advisories": [
        ],
        "affected_packages": [
        ],
        "bugzilla": "1944167",
        "bugzilla_description": "CVE-2021-3472 xorg-x11-server: XChangeFeedbackControl integer underflow leads to privilege escalation",
        "CVE": "CVE-2021-3472",
        "cvss_score": null,
        "cvss_scoring_vector": null,
        "cvss3_score": "7.8",
        "cvss3_scoring_vector": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H",
        "CWE": "CWE-191",
        "public_date": "2021-04-13T14:00:00Z",
        "resource_url": "https://access.redhat.com/hydra/rest/securitydata/cve/CVE-2021-3472.json",
        "severity": "important"
    },
    {
        "advisories": [
        ],
        "affected_packages": [
        ],
        "bugzilla": "1948726",
        "bugzilla_description": "CVE-2020-7924 mongodb: sslAllowInvalidHostnames bypass ssl/tls server certification validation entirely",
        "CVE": "CVE-2020-7924",
        "cvss_score": null,
        "cvss_scoring_vector": null,
        "cvss3_score": "5.1",
        "cvss3_scoring_vector": "CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N",
        "CWE": "CWE-295",
        "public_date": "2021-04-12T00:00:00Z",
        "resource_url": "https://access.redhat.com/hydra/rest/securitydata/cve/CVE-2020-7924.json",
        "severity": "moderate"
    }
]

Teraz chcę przeczytać plik JSON i pobrać zawartość słownika na podstawie wartości. Niech powiedz, że moja wartość jest CVE-2020-7924, a następnie muszę pobrać pełny słownik do zmiennej lub niektórych plików.

Na przykład, jeśli szukam CVE-2020-7924, a następnie wynik powinien być jak poniżej:

    {
        "advisories": [
        ],
        "affected_packages": [
        ],
        "bugzilla": "1948726",
        "bugzilla_description": "CVE-2020-7924 mongodb: sslAllowInvalidHostnames bypass ssl/tls server certification validation entirely",
        "CVE": "CVE-2020-7924",
        "cvss_score": null,
        "cvss_scoring_vector": null,
        "cvss3_score": "5.1",
        "cvss3_scoring_vector": "CVSS:3.1/AV:L/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N",
        "CWE": "CWE-295",
        "public_date": "2021-04-12T00:00:00Z",
        "resource_url": "https://access.redhat.com/hydra/rest/securitydata/cve/CVE-2020-7924.json",
        "severity": "moderate"
    }

Daj mi znać, jak mogę go kodować. Każda pomoc / sugestia jest doceniana.

-1
Rajesh 15 kwiecień 2021, 13:26

1 odpowiedź

Najlepsza odpowiedź

Aby przekonwertować ciąg JSON do DICT Pythona (lub w tym przypadku lista dyktów), możesz użyć {x0}}. Następnie, iteruj na liście dyktatów, spójrz, jeśli dict["CVE"] równa się twoją wartość, a jeśli tak, ustaw ją do pewnej zmiennej. Jeśli chcesz wyeksportować tę zmienną do łańcucha JSON, który mógłbyś napisać do pliku, użyj json.dumps. Przykład:

import json

CVE_voi = "CVE-2020-7924" # CVE_value_of_interest

inf = open("/path/to/file/containing/data.json", "r")
instr = inf.read()
print(len(instr)) # prints length of json str
print(instr[:100]) # prints first 99 chars of json str
inf.close()
dictlist = json.loads(instr)

for d in dictlist:
    if d["CVE"] == CVE_voi:
        doi = d # copy dict_of_interest in a variable
        outf = open("/path/to/outputfile.json", "w")
        outstr = json.dumps(doi)
        outf.write(outstr)
        outf.close()
        break
else: # print a message when no dict with the given CVE value was found
    print("no dict containing CVE %s could be found" % CVE_voi)
0
Programmer 15 kwiecień 2021, 15:11