PHP JSON String -> MySQL

AwesomSTUFF

Commodore
Registriert
Juli 2011
Beiträge
5.031
Morjen,

hab hier vor Jahren schon einmal gute Erfahrungen mit Hilfestellung aus dem Forum gehabt, mal sehen ob sich das heute wiederholen lässt :)

Also es geht um Folgendes:
Mein Kollege kam zu mir, da er weiss dass ich ein paar Webseiten betreibe und das Intranet der Firma aufbaue.
Er gab mir 3 Links welche offensichtlich jeweilig auf (recht umfangreiche) JSON Arrays verweisen. Es handelt sich um technische Anlagenparameter.
Die (Live) Daten aus den Strings möchte er sammeln und später per MS Access/EXCEL auswertbar machen.

Ich habe jetzt mal ein wenig begonnen mich damit zu befassen, aber um ehrlich zu sein übersteigt das meine Fähigkeiten. Ich kenn mich zwar mit klassischen MySQL einigermaßen aus, bei Access und Excel macht mir so schnell keiner was vor und paar CMS kann ich auch bedienen und anpassen. Aber hier müsste ich mich komplett einlesen und das kann ich atm nicht leisten.
Es gibt nun die Optionen ihm zu sagen "nope, sorry das mit Deinen Daten wird nix -musste dir nen Studi von der TH beschaffen oder drölfzigtausend Euro bei der GF beantragen (also im Klartext das ganze vor Geburt beerdigen)" oder es findet sich doch eine komfortable Variante. Ich habe zB gelesen, dass MySQL JSON nativ unterstützt und man somit den Transfer der Daten womöglich deutlich vereinfachen kann.

Also nochmal zusammengefasst:
- wir haben ein dickes fettes JSON Array von dem in einem bestimmten Zeitintervall Daten abgerufen und geloggt werden sollen
- wir haben bereits einen Apache Webserver und MySQL Datenbanken im Betrieb

- die Daten sollen später abrufbar und verarbeitet werden: Info-Screens, Reportings, Excel


Jemand der mir dabei helfen kann oder eine Empfehlung hat wer so etwas ggf. zu einem moderaten Preis anbieten kann?
In freudiger Erwartung ;)

MfG Dave
 
Naja, du müsstest doch eigentlich nur wissen, welche Struktur das JSON hat, dann kannst du die Datensätze in eine zu der Struktur passende MySQL-Tabelle packen (mit irgendeinem Dienst, der die Daten aus dem Link empfängt), am besten noch mit nem Timestamp (wenn nicht eh im Datensatz vorhanden).

Ansonsten noch stumpfer: das JSON unformatiert in eine Tabelle mit einer Spalte vom Typ JSON (ab MySQL 5.7 iirc) reinbuttern.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: DubZ und Madman1209
Ich glaube mal von einer Software gehört zu haben, die das kann: https://www.lobster.de
Sprich: Daten von definierbaren Quellen abholen, transformieren und in definierbare Quellen einspielen.

Ansonsten hört sich das nach einem tollen Projekt für einen Uni/FH-Praktikanten an.
 
  • Gefällt mir
Reaktionen: AwesomSTUFF und psYcho-edgE
lobster ist gar nicht notwendig... woher wird das JSON bezogen? Von einem Webservice?

Als erstes guckst du dir das JSON an und legst eine Tabelle mit passender Struktur an. Danach brauchst einfach nur ein kleines PHP Script welches das JSON decodiert und du die Werte in die Datenbank dann einträgst. Je nach Umfang des JSONs klingt das nach einer 1-8h Arbeit für einen Programmierer
 
  • Gefällt mir
Reaktionen: psYcho-edgE
Hallo Danke erstmal.
Soweit war ich auch schon, allerdings ist die Variante jeden Parameter aus dem Array quasi 1:1 zuzuordnen wohl auch die umständlichste und "unschönste" Variante die es gibt - Stichwort "Serialisierung". Für mich wäre eigentlich die "elegante" Lösung interessant-->assoziatives Array oder implode()/ explode().

Was mir da nicht ganz einleuchtet: wie bekomme ich mit den Varianten später einzelne Daten aus dem in der DB gesicherten Arry heraus? Da die Daten ja nicht klassische in einzeln abrufbaren Spalten aufzufinden sind sondern als "JSON Notation" vorliegen?!
 
Hi,

du sollst auch nicht das JSON direkt in die Datenbank schreiben sondern das JSON zerlegen und die einzelnen Felder in die Datenbank schreiben.

Hat DubZ ja auch geschrieben:

Als erstes guckst du dir das JSON an und legst eine Tabelle mit passender Struktur an.


Da die Daten ja nicht klassische in einzeln abrufbaren Spalten aufzufinden sind sondern als "JSON Notation" vorliegen?!

wieso sollten diese so vorliegen? Du entscheidest doch, wie die Daten abgelegt werden!

VG,
Mad
 
  • Gefällt mir
Reaktionen: psYcho-edgE
xdave78 schrieb:
Hallo Danke erstmal.
Soweit war ich auch schon, allerdings ist die Variante jeden Parameter aus dem Array quasi 1:1 zuzuordnen wohl auch die umständlichste und "unschönste" Variante die es gibt - Stichwort "Serialisierung". Für mich wäre eigentlich die "elegante" Lösung interessant-->assoziatives Array oder implode()/ explode().

Was mir da nicht ganz einleuchtet: wie bekomme ich mit den Varianten später einzelne Daten aus dem in der DB gesicherten Arry heraus? Da die Daten ja nicht klassische in einzeln abrufbaren Spalten aufzufinden sind sondern als "JSON Notation" vorliegen?!

In a nutshell:

JSON to Array: json_decode() --> Array in DB: mit mysqli
DB to Array: mit mysqli --> Array to JSON: json_encode
 
  • Gefällt mir
Reaktionen: AwesomSTUFF
Wenn ich es richtig verstehe willst du regelmäßig eine JSON abrufen, und dann alle(?) Daten für die spätere Auswertung speichern, wobei aber auch einzelne Teildaten abgerufen werden können sollen (ansonsten wäre SQL völlig unnötig), richtig? Ich würde das dann z.B. mit einer NodeJS App oder PHP und cronjob lösen, der Ablauf ist jedoch der Gleiche.

1.) Abrufen
2.) Lesen und INSERT Befehl bauen
3.) Speichern

Wenn die JSON sehr groß ist, und du keine hunderten Tabellen+Spalten per Hand anlegen willst, und den INSERT Befehl nicht hardcoden willst, dann kannst du das auch automatisch lösen, indem du die JSON iterierst und daraus dann CREATE TABLE(s), und später INSERTs baust.
 
  • Gefällt mir
Reaktionen: AwesomSTUFF
Madman1209 schrieb:
Hi,

du sollst auch nicht das JSON direkt in die Datenbank schreiben sondern das JSON zerlegen und die einzelnen Felder in die Datenbank schreiben.

VG,
Mad
Genau das ist doch die Frage. Ich möchte mir die Arbeit sparen, das ganze Array stundenlang zu zerlegen, wenn es eine elegantere Variante gibt. Zumal ich dann jedes Mal die DB und das ganze Skript ändern müsste wenn irgend eine Info dazu käme. Und die scheint es mit Serialisierung (so wie ich es verstanden habe wird das Array dabei 'automatisch' in passende Spalten einer DB zerlegt und gespeichert) zum Einen und dem "Speichern des Arrays als solches" ja zu geben. Was ich eben noch nicht weiß (auch jetzt noch nicht) ist, ob ich wenn ich die Daten "in einer Nussschale" (als Array) ablege, ich auch einzelne Infos herausbekomme oder dann nur das Array als ganzes abrufen muss um mir aus einem Array mit ...kA 100 Informationen eine einzelne Info zu holen? Natürlich kann ich das gesamte Array jedesmal decoden/in die Laufzeit laden...aber ist ja nicht so super effizient, oder spielt das keine Rolle?

Im Prinzip haben die letzten beiden Beiträge mir schon 70% der Frage beantwortet :)
 
Zuletzt bearbeitet:
also so wie es wirkt, wärst du mit einer JSON BLOB-basierten Datenbank wie MongoDB besser beraten meiner Meinung nach, da ist es auch nicht wild, wenn der Datensatz mal um ein zwei Eigenschaften größer ist
 
  • Gefällt mir
Reaktionen: AwesomSTUFF
Moin, also die wichtigsten Hinweise hast du ja schon bekommen. Seit Version 5.6 oder 5.7 unterstützt MySQL den JSON Datentyp. Das bedeutet grob, dass du Aggregationen und Selektionen gegen die JSON Daten fahren kannst, genau das was du später brauchst für die Reports. Speichern konnte man JSON schon immer in MySQL, ist ja nur ein String. Für die Abfragen gibt es dann spezielle MySQL Funktionen, die über klassisches SQL hinaus gehen. Wenn nichts dagegen spricht würde ich dennoch zur MongoDB / CouchDB raten, die als Dokumentendatenbanken für den genannten Zweck geeigneter erscheinen. Wenn es erstmal nur darum geht, die Daten abzurufen und zu speichern, baue es genauso wie du es gewohnt bist und betrachte die JSON Daten einfach nur als String.
 
  • Gefällt mir
Reaktionen: psYcho-edgE und AwesomSTUFF
kling1 schrieb:
Ja danke, das hatte ich ja eingangs schon angerissen, dass ich das mal gelesen hatte. Danke.

@Sgt_H4rtman Danke. Die ergänzende Info zu MySQL war jetzt auch nochmal wertvoll. Ich schau mir die genannten Datenbanken mal an.

@alle: Super, danke. Ich werde mal so rangehen, dass ich meinem Kollegen sage, dass er vllt sein JSOIN Array mal auf ein handlebares Maß runterbricht und vllt. nicht alle Maschinendaten die es zu geben scheint in ein Array packt. Ich hab mir mal einen Abruf kopiert und den String in eine .txt getan - selbst da ist er 10 Zeilen lang (unformatiert). Oder er besorgt sich über die Personalabteilung einen Studenten von der TH um die Ecke :)

Interesse halber und mit Euren Hinweisen schau ich es mir jetzt trotzdem erstmal selber an.
 
Zuletzt bearbeitet:
Zurück
Oben