Rekursiver Spaziergang durch eine JSON-Datei, in der SELECTED-Zeichenfolgen extrahiert werden

Ich muss rekursiv durch JSON-Dateien gehen (Antworten von einer API posten) und die Zeichenfolgen extrahieren, die ["text"] als Schlüssel haben{"text":"this is a string"}

Ich muss mit dem Parsen von der Quelle beginnen, die das älteste Datum in den Metadaten hat, die Zeichenfolgen aus dieser Quelle extrahieren und dann zur zweitältesten Quelle wechseln und so weiter. JSON-Datei ist möglicherweise schlecht verschachtelt und die Ebene, auf der sich die Zeichenfolgen befinden, kann sich von Zeit zu Zeit ändern.

Problem: Es gibt viele Schlüssel mit dem Namen ["text"] und ich brauche nicht alle, ich brauche NUR die mit Werten als Zeichenfolge. Besser, der "text": "string", den ich brauche, befindet sich IMMER im selben Objekt {} eines"type":"sentence". Siehe Bild

Was ich frage

Ändern Sie den 2. Code unten, um die Datei rekursiv zu durchlaufen und NUR die ["text"] -Werte zu extrahieren, wenn sie sich im selben Objekt {} zusammen mit "type": "sentence" befinden.

Below ein Ausschnitt aus der JSON-Datei (in grün der Text, den ich brauche, und die Medatada, in rot die, die ich nicht extrahieren muss):

Link zum vollständigen JSON-Beispiel:http: //pastebin.com/0NS5BiD

Was ich bisher gemacht habe:

1) Der einfache Weg: Transformiere die json-Datei in einen String und suche nach Inhalten zwischen den doppelten Anführungszeichen (""), weil in allen json-Post-Antworten die "Strings", die ich brauche, die einzigen sind, die zwischen doppelten Anführungszeichen stehen. Diese Option verhindert jedoch, dass ich die Ressourcen vorher bestellen kann, und ist daher nicht gut genug.

r1 = s.post(url2, data=payload1)
j = str(r1.json())

sentences_list = (re.findall(r'\"(.+?)\"', j))

numentries = 0
for sentences in sentences_list:
    numentries += 1
    print(sentences)
    print(numentries)

2) Cleverer Weg: Rekursives Durchlaufen einer JSON-Datei und Extrahieren der ["text"] -Werte

def get_all(myjson, key):
    if type(myjson) is dict:
        for jsonkey in (myjson):
            if type(myjson[jsonkey]) in (list, dict):
                get_all(myjson[jsonkey], key)
            elif jsonkey == key:
                print (myjson[jsonkey])
    elif type(myjson) is list:
        for item in myjson:
            if type(item) in (list, dict):
                get_all(item, key)

print(get_all(r1.json(), "text"))

It extrahiert alle Werte, die ["text"] als Schlüssel haben. Leider gibt es in der Datei noch andere Dinge (die ich nicht brauche), die ["text"] als Schlüssel haben. Daher wird Text zurückgegeben, den ich nicht benötige.

Bitte beraten

AKTUALISIERE

Ich habe 2 Codes geschrieben, um die Liste der Objekte nach einem bestimmten Schlüssel zu sortieren. Die erste Sortierung erfolgt nach dem 'Text' der XML-Datei. Die 2. nach 'Bestehende Periode von' Wert.

Die erste Methode funktioniert, aber einige XML-Dateien enthalten tatsächlich Dokumente, die älter sind als ich erwartet hatte, auch wenn ihre Anzahl höher ist.

Für den 2. Code ist das Format von 'Bestehender Zeitraum von' nicht konsistent und manchmal ist der Wert überhaupt nicht vorhanden. Der zweite gibt mir auch einen Fehler, aber ich kann nicht herausfinden, warum -string indices must be integers.

# 1st code (it works but not ideal)

j=r1.json()

list = []
for row in j["tree"]["children"][0]["children"]:
    list.append(row)

newlist = sorted(list, key=lambda k: k['text'][-9:])
print(newlist)

# 2nd code I need something to expect missing values and to solve the
# list index error
list = []
for row in j["tree"]["children"][0]["children"]:
    list.append(row)

def date(key):
    return dparser.parse((' '.join(key.split(' ')[-3:])),fuzzy=True)

def order(list_to_order):
    try:
        return sorted(list_to_order,
                      key=lambda k: k[date(["metadata"][0]["value"])])
    except ValueError:
        return 0

print(order(list))

Antworten auf die Frage(2)

Ihre Antwort auf die Frage