2011-10-25 15 views
6

tengo este archivo .json deseada:de anexión de datos a un archivo .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" 
    } 
] 

que estoy haciendo esto con el código PHP:

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

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

La cosa es que yo' No estoy seguro de exactamente cómo lograrlo. Voy a llamar este código arriba cada vez que se envía un formulario, por lo que necesito que la ID se incremente y también mantener la estructura JSON válida con [y {, ¿es esto posible?

+4

No creo que JSON sea un formato incremental; deberá deserializarlo, agregar su nuevo registro y volver a serializarlo. – Neil

+1

Sé que no es la respuesta a su pregunta, pero esto me recuerda una vez que traté de hacer lo mismo con XML. El propósito era almacenar publicaciones de blog, y pensé que sería una buena manera de evitar la necesidad de MySQL. Esto, sin embargo, no resultó ser el caso. Es más confiable, mejor práctica y mucho menos dolor a largo plazo, usar una base de datos en lugar de un archivo para este tipo de datos. Pido disculpas, sé que es muy molesto cuando haces una pregunta y alguien da "no hagas eso" como respuesta (y es por eso que estoy publicando esto como un comentario). Es justo lo que desearía que me hubieran dicho antes. –

+0

de anexión de datos a un archivo .json [introduzca la descripción enlace aquí] [1] [1]: http://stackoverflow.com/questions/12290572/appending-to-json-file-in-javascript –

Respuesta

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

¿No tomará más tiempo hacerlo todo el tiempo? ¿No podría ser bastante ridículo cuando tienes un archivo JSON ENORME? Estoy lidiando con una gran cantidad de datos. – Goahnary

+0

newbie php guy aquí ...¿Cómo puedo modificar la respuesta anterior para que funcione si obtengo mis "datos de publicación" usando file_get_contents ('php: // input')? Entonces, básicamente, la primera línea no funciona para mí. Estoy usando file_get_contents ('php: // input') porque estoy llamando a fetch() en JS para hacer la publicación http. –

12

Estás arruinando tus datos de json adjuntando texto a ciegas. JSON no es un formato que pueda manipularse de esta manera.

Tendrá que cargar su texto json, decodificarlo, manipular la estructura de datos resultante, luego volver a codificar/guardarlo.

<?php 

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

Digamos que tienes [1,2,3] almacenada en su archivo. Su código podría convertirlo en [1,2,3]4, que es sintácticamente incorrecto.

4

Si desea agregar otro elemento de matriz a un archivo JSON como muestra su ejemplo, abra el archivo y busque hasta el final. Si el archivo ya tiene datos, busque hacia atrás un byte para sobrescribir el "]" después de la última entrada, luego escriba "," más los datos nuevos menos el "[" inicial de los datos nuevos. De lo contrario, es su primer elemento de matriz, así que simplemente escriba su matriz normalmente.

Lo siento, no sé lo suficiente sobre PHP para publicar código real, pero he hecho esto en Obj-C y que me ha permitido evitar leer todo el archivo en principio sólo para sumarse a este fin:

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

Esto ha tomado el ejemplo c anterior y lo movió a php. Esto saltará al final del archivo y agregará los nuevos datos sin leer todo el archivo en la 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

Código de muestra Solía ​​anexar una matriz JSON adicional al archivo 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);