JSON nach einem Wort / String durchsuchen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

Hey,

ich habe eine JSON-Datei die wie folgt aussieht:

Code: Alles auswählen


{
    "Kopf": [
        {
            "Wert": "0238",
            "name": "XYZ"
        },
        {
            "Wert": "1",
            "name": "HGZ"
        },
        {
            "Wert": "12345",
            "name": "Nummer"
        },
        {
            "Wert": "Stefan",
            "name": "Prüfer"
        }
    ],
    "Körper": [
        {
            "Wert": "240.000",
            "Ebene1": {
                "Wert": "0.000"
            },
            "name": "Durchmesser [mm]",
            "status": {
                "Wert": ""
            },
            "Ebene2": {
                "Wert": "0.000"
            },
            "Name2": "Durchmesser"
        },
        {
            "Wert": "19.8944",
            "Ebene2": {
                "Wert": "0.000"
            },
            "name": "Statisch",
            "status": {
                "Wert": ""
            },
            "Ebene2": {
                "Wert": "0.000"
            },
            "Name2": "MasseEbene2"
        }
  }
ich muss nun die komplette JSON-Datei nach "Statisch" durchsuchen.
Leider kann ich nicht mit Indizes arbeiten, da die JSON-Datei jedes Mal unterschiedlich groß sein kann.
Des Weiteren kann da auch mal etwas anderes drin stehen wie z.B. "Statisch_Zustand" (Was nicht schlimm ist, da ich eine IF-Abfrage machen werden --> Wenn Statisch dann mach XY sonst ....).

Gibt es eine Möglichkeit ?
Danke für die Antworten schon im Vorraus :)
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kirikkayis: Ich habe das Gefühl das die Beschreibung nicht stimmt, und sie ist auch nicht vollständig. Soll da wirklich das gesamte JSON-Dokument durchsucht werden, oder hat die Struktur der Daten auch einen Einfluss darauf? Sollen alle Zeichenketten betrachtet werden, oder nur die direkt in Objekten? Sollen auch Attributnamen von Objekten betrachtet werden, oder nur Werte? Und was soll das Ergebnis der Suche sein? Eine einfache ja/nein-Antwort? Die Werte? Bei Objekten Attributname/Wert-Paare? Das Objekt in dem der Treffer vorkommt? Pfadbeschreibungen zu den Treffern?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, Du willst nicht die komplette JSON-Datei nach "Statisch" durchsuchen, Denn Du willst sicher nicht, dass ein Prüfer mit dem Namen "Statisch" gefunden wird.
Was Du willst, ist im Schlüssel "Körper" alle Elemente der Liste durchgehen und schauen, ob es einen Key "name" mit dem Wert "Statisch" gibt. Und diesen Satz kann man quasi wörtlich nach Python übersetzen.
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

Doch, ich möchte die GESAMTE JSON-Datei nach "Statisch" suchen.

"Statisch" oder "Dynamisch" kommt EIN EINZIGES mal vor und dies kann in "Körper" oder in "Kopf" stehen.
Ich weiß wie ich auf die "keys" bzw. auf die "values" parsen kann.
jedoch muss ich hier wirklich das gesamte Dokument durchsuchen.

Sorry wenn ich mich Falsch bzw. Fehlerhaft ausgedrückt habe.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wer ist denn fuer dieses JSON verantwortlich? Das ist sehr ungewoehnlich strukturiert.

Ansonsten: willkommen im ersten Semester Informatik, heute zum Thema "Rekursive Abarbeitung von Datenstrukturen".

Du musst dir eine Funktion schreiben, die je nach uebergebenem Objekt entscheided, was sie tut:

Code: Alles auswählen

 - eine Liste wird rekursiv mit den Elementen der Liste aufgerufen.
 - bei einem Objekt werden Schluessel/Werte aufgezaehlt, und dann abhaengig vom Wert
     - bei einem string wird auf "Statisch" verglichen, und die Funktion kehr mit True zurueck.
     - bei einer Liste oder einem Objekt wird ebenfalls rekursiv aufgerufen.
     - alles andere wird ignoriert.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kirikkayis: Du hast Dich nicht falsch ausgedrückt, es ist nur so, dass es keinen sinnvollen Anwendungsfall für diese Forderung gibt, und ich daher nicht glaube, dass derjenige, der die Aufgabe gestellt hat, das so meint.

Und bleiben noch die Fragen von __blackjack__, was denn das Resultat der Suche sein soll.
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

Na gut, dann muss ich wohl eine Funktion schreibe, danke für die Ideen und Antworten.

@__deets__ ich hatte im ersten Semester keine Vorlesung namens "Rekursive Abarbeitung von Datenstrukturen" selbst wenn, die Programmiersprachen ändern sich von der Syntax her. Daher war diese Anmerkung, meiner Meinung nach, unnötig. Trotzdem Danke für deine Beschreibung.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es war ehrlich gesagt nicht als Unterstellung deiner Inkompetenz, sondern als salopp formulierter Hintergrund zur Loesungstrategie gedacht. Und das Konzept der Rekursion hat mit der Syntax nichts zu tun, sondern ist universell. Aber bevor es hier mehr Missverstaendnisse gibt, lasse ich deine Posts lieber mal links liegen. Viel Erfolg.
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Netter Anwendungsfall für `functools.singledispatch()`:

Code: Alles auswählen

#!/usr/bin/env python3
import json
from functools import singledispatch


JSON = '''\
{
    "Kopf": [
        {
            "Wert": "0238",
            "name": "XYZ"
        },
        {
            "Wert": "1",
            "name": "HGZ"
        },
        {
            "Wert": "12345",
            "name": "Nummer"
        },
        {
            "Wert": "Stefan",
            "name": "Prüfer"
        }
    ],
    "Körper": [
        {
            "Wert": "240.000",
            "Ebene1": {
                "Wert": "0.000"
            },
            "name": "Durchmesser [mm]",
            "status": {
                "Wert": ""
            },
            "Ebene2": {
                "Wert": "0.000"
            },
            "Name2": "Durchmesser"
        },
        {
            "Wert": "19.8944",
            "Ebene2": {
                "Wert": "0.000"
            },
            "name": "Statisch",
            "status": {
                "Wert": ""
            },
            "Ebene2": {
                "Wert": "0.000"
            },
            "Name2": "MasseEbene2"
        }
    ]
}
'''

@singledispatch
def is_static(_json):
    return False


@is_static.register(str)
def is_static_string(value):
    return value == 'Statisch'


@is_static.register(list)
def is_static_in_array(items):
    return any(map(is_static, items))


@is_static.register(dict)
def is_static_in_object(object_):
    return (
        any(map(is_static, object_.keys()))
        or any(map(is_static, object_.values()))
    )


def main():
    data = json.loads(JSON)
    print(is_static(data))


if __name__ == '__main__':
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Kirikkayis
User
Beiträge: 85
Registriert: Freitag 18. Januar 2019, 08:02

__blackjack__ hat geschrieben: Dienstag 25. Juni 2019, 10:55 Netter Anwendungsfall für `functools.singledispatch()`:

Code: Alles auswählen

#!/usr/bin/env python3
import json
from functools import singledispatch


JSON = '''\
{
    "Kopf": [
        {
            "Wert": "0238",
            "name": "XYZ"
        },
        {
            "Wert": "1",
            "name": "HGZ"
        },
        {
            "Wert": "12345",
            "name": "Nummer"
        },
        {
            "Wert": "Stefan",
            "name": "Prüfer"
        }
    ],
    "Körper": [
        {
            "Wert": "240.000",
            "Ebene1": {
                "Wert": "0.000"
            },
            "name": "Durchmesser [mm]",
            "status": {
                "Wert": ""
            },
            "Ebene2": {
                "Wert": "0.000"
            },
            "Name2": "Durchmesser"
        },
        {
            "Wert": "19.8944",
            "Ebene2": {
                "Wert": "0.000"
            },
            "name": "Statisch",
            "status": {
                "Wert": ""
            },
            "Ebene2": {
                "Wert": "0.000"
            },
            "Name2": "MasseEbene2"
        }
    ]
}
'''

@singledispatch
def is_static(_json):
    return False


@is_static.register(str)
def is_static_string(value):
    return value == 'Statisch'


@is_static.register(list)
def is_static_in_array(items):
    return any(map(is_static, items))


@is_static.register(dict)
def is_static_in_object(object_):
    return (
        any(map(is_static, object_.keys()))
        or any(map(is_static, object_.values()))
    )


def main():
    data = json.loads(JSON)
    print(is_static(data))


if __name__ == '__main__':
    main()
Ich danke dir vielmals, allein für deine Mühe.
Vieln Dank nochmal !!
Antworten