PHP: JSON in CSV konvertieren

canju

Erfahrenes Mitglied
Hallo ihr Lieben,

ich bin hier gerade am verweifeln und hoffe ihr könnt mir (mal) wieder helfen.

Ich lade mir über einen api call via basic auth eine .json datei auf einen ftp.
Ich möchte diese .json Datei jetzt mit PHP in eine .csv Datei convertieren. Ich kriege das einfach nicht hin (ich würde am liebsten gerade in den Tisch beißen). Habe schon einige Scripte vergebens ausprobiert. meist ist der Fehler, dass nach dem json_decode kein Array vorliegt.

Der Inhalt der .json Datei sieht so aus:

JSON:
{
   "status_code":200,
   "status_message":"OK",
   "data":[
      {
         "id":1234565,
         "status":"confirmed",
         "amount_net":453,
         "created":"2019-10-15 12:00:00",
         "tracking":"rrkkdje3-343-3434",
         "product":"car",
         "gclid":null,
         "referer_url":"",
         "cancel_reason":null
      },
      {
         "id":9876363,
         "status":"verg\u00fctet",
         "amount_net":13,
         "created":"2019-10-19 12:00:00",
         "tracking":"0984dd-e9934",
         "insurance":"boat",
         "gclid":null,
         "referer_url":"",
         "cancel_reason":null
      }
   ]
}

Ich bräuchte jetzt die "Datensätze" innerhalb von "data":[...] jeweils als eigene Zeile in der .csv Datei. Inkl. Überschriften.

Könte mir evtl. einer von euch Profis mit einem kleinen PHP Snippet das die json datei in csv konvertiert aushelfen?

Grüße,
Canju
 
Lösung
Statt die Resultate einfach hinter einander zu hängen, müssen wir die Arrays zusammen führen durch die Funktion array_merge:
PHP: array_merge - Manual
(Ein Kommentar dort sagt, dass das Anhängen mit einer Schleife um Längen schneller ist aber um den Code kurz zu halten habe ich mal array_merge verwendet).
Code:
$bearer_token = 'token';
//API KEY AND PASSWORD
$headers = array("Authorization: Bearer $bearer_token", 'Content-Type: application/json');
$current_datetime = date("Y-m-d H:i:s");
$script_name = $_SERVER['SCRIPT_NAME'];
$dateObj = new DateTime();
$dateObj->modify('-12 months');
$responseArr = [];
for ($i = 0; $i < 13; $i++) {
    // prepare start and end time and URL:
    $start_date = $dateObj->format('Y-m-d')...
Bin ich blöd , oder kann das sein das du versucht 3000-mal den gleichen Eintrag zu machen?
Steht in
'$id',
und
'$commission'
Nicht immer das gleiche drin , so wie du es machst?
Oder übersehe ich da was ?

Und
mysqli_query()
sollte schon in der Schleife und nicht dahinter
 
Zuletzt bearbeitet:
Einmal das und zusätzlich wird die Schleife beendet ohne dass das Insert ausgeführt wird, das passiert erst nach dem Schleifenende:
Code:
//convert json object to php associative array
$data = json_decode($jsondata, true);

//get data details
$id = $data['id'];
$commission = $data['transactionParts']['commissionAmount'];

if ($id == '' or !isset($id)) {$id = null;}
;
if ($commission == '' or !isset($commission)) {$commission = null;}
;

//insert into mysql table
for ($i = 0; $i < count($data); $i++) {
    $insert_data = <<<SQL
INSERT INTO $table_name(
              id,
              commission
            )
            VALUES(
              '$id',
              '$commission'
            )
SQL;
} // hier Schleifenende ohne dass das SQL ausgeführt wurde

$db->query($insert_data);

if (!mysqli_query($db, $insert_data)) {
    die('Error : ' . mysql_error());
}
mysqli_close($db);
 
Und nochwas
Code:
$db->query($insert_data);

if(!mysqli_query($db, $insert_data))
Da mit schreibst du alles doppelt in der DB.

Du solltest dich für
Objektorientierter Stil
oder
Prozeduraler Stil entscheiden. Das zu mischen funktioniert vielleicht , aber ist nicht Sinn der Sache.
 
danke euch beiden.

habe das doppelte ausführen rausgenommen und den teil
PHP:
if (!mysqli_query($db, $insert_data)) {
    die('Error : ' . mysql_error());
}
vor das schleifenende gesetzt. Jetzt wird tatsächlich 3000+ mal der gleiche datensatz in die db geschrieben :D
 
ich vermute ich brauche eine foreach schleife? aber ich kriegs nicht hin die schleife um den insert querry drum zu basteln.
 
erstmal solltest du das , was du in Post 28 geschrieben hast einbauen.
Du hast doch schon nee Schleife. Du musst da nur noch ein paar Sachen reinschmeißen .
Eigentlich brauchst du nur die Zeile
PHP:
for ($i = 0; $i < count($data); $i++) {
Weiter nach oben verschieben wenn ich das jetzt richtig sehe
 
Das von Post 28 habe ich schon geändert. Habe jetzt noch die Zeile weiter nach oben verschoben, hat aber leider nichts geändert. immernoch 3000mal der gleiche datensatz:
PHP:
<?php
// Load the database configuration file
include_once 'dbConfig.php';

$table_name = 'tabellen_name';
//read the json file contents
$jsondata = file_get_contents('path/to/file.json');

//convert json object to php associative array
$data = json_decode($jsondata, true);

for ($i = 0; $i < count($data); $i++) {
  //get data details
  $id = $data[0]['id'];
  $commission = $data[0]['transactionParts'][0]['commissionAmount'];

  if($id == '' OR !isset($id)){$id = null;};
  if($commission == '' OR !isset($commission)){$commission = null;};

  //insert into mysql table
  $insert_data = <<<SQL
  INSERT INTO $table_name(
                id,
                commission
              )
              VALUES(
                '$id',
                '$commission'
              )
  SQL;

  if(!mysqli_query($db, $insert_data))
  {
      die('Error : ' . mysql_error());
  }

}

mysqli_close($db);
?>
 
PHP:
  $id = $data[0]['id'];
  $commission = $data[0]['transactionParts'][0]['commissionAmount'];
Ich kenne jetzt nicht die ganze JSON ,denke aber der JSON Code aus POST 26# 3000 mal länger ist oder ?

Du musst jetzt nur noch die nullen ändern damit die null von 0 bis 3000 hoch zählen kann
 
Zurück