2011-10-25 17 views
6

ho questo file .json desiderata:dati aggiungere a un file di .json con PHP

[ 
    { 
     "id": 1, 
     "title": "Ben\\'s First Blog Post", 
     "content": "This is the content" 
    }, 
    { 
     "id": 2, 
     "title": "Ben\\'s Second Blog Post", 
     "content": "This is the content" 
    } 
] 

che sto facendo questo con il codice PHP:

<?php 
$data[] = $_POST['data']; 

$fp = fopen('results.json', 'a'); 
fwrite($fp, json_encode($data)); 
fclose($fp); 

La cosa è, io' Non sono sicuro esattamente su come raggiungerlo. Chiamerò questo codice sopra ogni volta che viene inviato un modulo, quindi ho bisogno dell'ID per incrementare e mantenere anche la struttura JSON valida con [e {, è possibile?

+4

Non credo JSON è un formato incrementale; dovrai deserializzare, aggiungere il tuo nuovo record e serializzarlo di nuovo. – Neil

+1

So che non è la risposta alla tua domanda, ma questo mi ricorda una volta che ho provato a fare la stessa cosa con XML. Lo scopo era archiviare i post del blog e pensavo che sarebbe stato un modo interessante per evitare di avere bisogno di MySQL. Questo, tuttavia, non è risultato essere il caso. È più affidabile, pratica migliore e meno sofferenza a lungo termine, utilizzare un database piuttosto che un file per questo tipo di dati. Mi scuso, so che è super fastidioso quando fai una domanda e qualcuno ti dà "non farlo" come risposta (che è il motivo per cui sto postando questo come commento). È proprio quello che vorrei che mi fosse stato detto prima. –

+0

accodare i dati in un file .json [ENTER Descrizione Link qui] [1] [1]: http://stackoverflow.com/questions/12290572/appending-to-json-file-in-javascript –

risposta

28
$data[] = $_POST['data']; 

$inp = file_get_contents('results.json'); 
$tempArray = json_decode($inp); 
array_push($tempArray, $data); 
$jsonData = json_encode($tempArray); 
file_put_contents('results.json', $jsonData); 
+15

Non ci vorrà più tempo per fare ogni volta? Non potrebbe diventare ridicolo quando hai un file JSON ENORME? Ho a che fare con molti dati. – Goahnary

+0

newbie php guy here ...come modifico la risposta di cui sopra per funzionare se ottengo i miei "post dati" usando file_get_contents ('php: // input')? Quindi in pratica la prima linea non funziona per me. Sto usando file_get_contents ('php: // input') perché sto chiamando fetch() in JS per fare il post http. –

12

Stai rovinando i tuoi dati JSON aggiungendo ciecamente testo ad esso. JSON non è un formato che può essere manipolato in questo modo.

Dovrai caricare il testo JSON, decodificarlo, manipolare la struttura dati risultante, quindi ricodificarlo/salvarlo.

<?php 

$json = file_get_contents('results.json'); 
$data = json_decode($json); 
$data[] = $_POST['data']; 
file_put_contents('results.json', json_encode($data)); 

Diciamo che hai [1,2,3] memorizzati nel file. Il tuo codice potrebbe trasformarlo in [1,2,3]4, che è sintatticamente sbagliato.

4

Se si desidera aggiungere un altro elemento di matrice a un file JSON come mostra l'esempio, aprire il file e cercare fino alla fine. Se il file contiene già dati, cerca indietro di un byte per sovrascrivere "]" dopo l'ultima voce, quindi scrivi "," più i nuovi dati meno il "[" iniziale dei nuovi dati. Altrimenti, è il tuo primo elemento dell'array, quindi scrivi semplicemente il tuo array normalmente.

dispiace non so abbastanza di PHP per inviare codice vero e proprio, ma ho fatto questo in Obj-C e sta mi ha permesso di evitare di leggere l'intero file in prima solo per aggiungere sulla fine:

NSArray *array = @[myDictionary]; 
NSData *data = [NSJSONSerialization dataWithJSONObject:array options:0 error:nil]; 
FILE *fp = fopen(fname, "r+"); 
if (NULL == fp) 
    fp = fopen(fname, "w+"); 
if (fp) { 
    fseek(fp, 0L, SEEK_END); 
    if (ftell(fp) > 0) { 
     fseek(fp, -1L, SEEK_END); 
     fwrite(",", 1, 1, fp); 
     fwrite([data bytes] + 1, [data length] - 1, 1, fp); 
    } 
    else 
     fwrite([data bytes], [data length], 1, fp); 
    fclose(fp); 
} 
17

Questo ha preso l'esempio c precedente e spostato su php. Questo salterà alla fine del file e aggiungerà i nuovi dati senza leggere tutti i file in memoria.

// read the file if present 
$handle = @fopen($filename, 'r+'); 

// create the file if needed 
if ($handle === null) 
{ 
    $handle = fopen($filename, 'w+'); 
} 

if ($handle) 
{ 
    // seek to the end 
    fseek($handle, 0, SEEK_END); 

    // are we at the end of is the file empty 
    if (ftell($handle) > 0) 
    { 
     // move back a byte 
     fseek($handle, -1, SEEK_END); 

     // add the trailing comma 
     fwrite($handle, ',', 1); 

     // add the new json string 
     fwrite($handle, json_encode($event) . ']'); 
    } 
    else 
    { 
     // write the first event inside an array 
     fwrite($handle, json_encode(array($event))); 
    } 

     // close the handle on the file 
     fclose($handle); 
} 
3

Codice di esempio utilizzato per aggiungere l'array JSON aggiuntivo al file json.

   $AdditionalArray = array(
       'id' => $id, 
       'title' => $title, 
       'content' => $content 
       ); 

       //open or read json data 
       $data_results = file_get_contents('results.json'); 

       $tempArray = json_decode($data_results); 
       //append additional json to json file 
       $tempArray[]=$AdditionalArray; 
       $jsonData = json_encode($tempArray); 

      file_put_contents('results.json', $jsonData); 
Problemi correlati