Werte aus Json in Objekte lesen

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
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

Hallo, meistens sind die einfachsten Sachen die einen am meisten aufhalten:

Ich nutze einen curl von Feiertagen, den Output prase ich mir in eine Json. als Datei

Hier ein Auszug aus der Json:
{
"1. Weihnachtstag": {
"datum": "2020-12-25",
"hinweis": ""
},
"2. Weihnachtstag": {
"datum": "2020-12-26",
"hinweis": ""
},
"Allerheiligen": {
"datum": "2020-11-01",
"hinweis": ""
},

Damit ich die Werte in eine vorhandene Firebird Datenbank in einzelne Felder schreiben kann benötige ich die Feiertage als Objekt sowie das Datum (welches ich noch umformatieren muss in DD.MM.YYYY). Ich habe jetzt den ganzen Abend mit recherche zugebracht, aber es will mir nicht gelingen die Werte in Objekte zu bekommen.

Es würde mich sehr freuen wenn mir jemand den Hinweis geben kann wie ich das hin bekomme. Der Rest des Codes steht :-)
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Warum der komplizierte Umweg? Bevor du mit 'curl' etwas holst und eine json-Datei schreibst, die du dann liest, kannst du die Daten auch direkt mit Python holen. Spart einen Bruch. Schau dir das requests Modul an.

In der Standardbibliothek ist das json Modul. Damit liest du entsprechend formatierte Daten ein.

Das datetime Modul für das Datum.
Wobei es hier sehr seltsa wäre, wenn man das so formatieren müsste, wie du schreibst.
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

Vielen Dank für deine Antwort.

Das json Modul nutze ich bereits um das json in das Format oben zu setzen. Den Import in die Datei will ich haben, um zu sehen was gezogen wurde (kann man als Log sehen wenn man will).
Ich verstehe bei dem Json nur nicht wie ich 1.Weihnachtstag auslesen kann und den zugehörigen Wert Datum. Ich weiss es gibt 1000 Beispiele im Web. Aber in diesen ist das Json meistens anders gegliedert.

Vielleicht hat jemand einen kleinen Codeschnipsel für mich damit ich es schnalle ?

Das Datum muss tatsächlich so formatiert werden, auch wenn es nicht üblich ist :-)
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Wenn du die json eingelesen hast mit

Code: Alles auswählen

with open('TEST.json') as json_file:
    data = json.load(json_file)
dann kannst du die Werte auslesen wie bei einem Dictionary.

Also so sprichst du die einzelnen Werte an:

Code: Alles auswählen

for day in data:
    print(day)
    print(data[day]['datum'])
    print(data[day]['hinweis'])
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das schöne ist, dass JSON und Python-Datenstrukturen ziemlich gut zusammen passen. Ein JSON-Object ist ein Python Dict und ein JSON-Array eine Python Liste. Bei der gegebenen Datenstruktur hast du also in Python ein verschachteltest Dict, in dem "1. Weihnachtstag" etc. die Schlüssel sind, deren Werte wiederum ein Dict sind.

Ansonten gilt: zeig' deinen Code, auch wenn der ggf. nicht funktioniert, dann hat man einen konkreteren Ansatz zum helfen.

Gruß, noisefloor
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

Danke für deine schnelle Antwort,

ich glaube so langsam fällt der Groschen.....
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

import json
import datetime

with open('NRW.txt') as json_file:
data = json.load(json_file)

for day in data:

Feiertag = (day)
Feiertagsdatum = datetime.datetime.strptime((data[day]['datum']), '%Y-%m-%d').strftime('%d.%m.%Y')
Bemerkung = (data[day]['hinweis'])
print (Feiertag)
print (Feiertagsdatum)
print (Bemerkung)


Danke das war genau der Tip der mir fehlte, es macht was es machen soll nun!
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum weißt Du die Schlüssel erst der Variable `day` zu, um sie gleich danach an `Feiertag` zu binden. Warum nicht gleich `Feiertag`?
Wenn Du zusätzlich den Inhalt brauchst, gibt es dict.item.
Variablennamen schreibt man komplett klein.
Warum mußt Du das Datum umformatieren? Für Datenbanken ist ja das erstere üblich.

Code: Alles auswählen

import json
import datetime

with open('NRW.txt', encoding="utf8") as json_file:
    feiertage = json.load(json_file)
    
for feiertag, info in feiertage.items():
    feiertagsdatum = datetime.datetime.strptime(info['datum'], '%Y-%m-%d')
    bemerkung = info['hinweis']
    print(feiertag)
    print(feiertagsdatum.strftime('%d.%m.%Y'))
    print(bemerkung)
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

Wieder einmal Danke für die Antwort, wieder etwas schlauer....
Ich habe deinen Code verstanden und nun so eingebaut.

Wieso das Datenbankfeld das Datum in dem Format willl weiss ich nicht. Es handelt sich um eine bestehende Datenbankstruktur einer Software. Mache ich einen insert per SQL Manager Lite mit dem üblichen Format, bekomme ich falsches Datumsformat zurück. Also trage ich es umformatiert ein, und es geht.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@cbesi: Wieso wird das Datum überhaupt als Zeichenkette formatiert? Die DB API V2 nimmt da eigentlich `datetime`-Objekte und keine Zeichenketten. Es kann sein das konkrete Module die diese API umsetzen auch Zeichenketten nehmen, aber das muss nicht sein, und bringt halt genau solche Formatprobleme mit sich.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten