У меня есть этот желаемый файл .json:
[ { "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" } ]
Я делаю это с помощью этого PHP-кода:
<?php $data[] = $_POST['data']; $fp = fopen('results.json', 'a'); fwrite($fp, json_encode($data)); fclose($fp);
Дело в том, что я не уверен точно, как его достичь. Я буду называть этот код выше каждый раз, когда отправляется форма, поэтому мне нужно, чтобы идентификатор увеличивался, а также сохранял действительную структуру JSON с [и {, возможно ли это?
$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);
Это взято выше, например, и переместило его на php. Это переместится в конец файла и добавит новые данные, не читая весь файл в памяти.
// 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); }
Вы разрушаете свои данные json, слепо добавляя текст к нему. JSON – это не формат, который можно манипулировать таким образом.
Вам придется загружать текст json, декодировать его, манипулировать результирующей структурой данных, затем перекодировать / сохранять его.
<?php $json = file_get_contents('results.json'); $data = json_decode($json); $data[] = $_POST['data']; file_put_contents('results.json', json_encode($data));
Допустим, у вас [1,2,3]
сохранено в вашем файле. Ваш код может превратить это в [1,2,3]4
, что является синтаксически неправильным.
Если вы хотите добавить еще один элемент массива в файл JSON, как показывает ваш пример, откройте файл и найдите его до конца. Если у файла уже есть данные, найдите назад один байт, чтобы перезаписать «]» после последней записи, затем напишите «,» плюс новые данные минус начальные «[» новых данных. В противном случае это ваш первый элемент массива, поэтому просто напишите свой массив в обычном режиме.
Извините, я не знаю достаточно о PHP, чтобы опубликовать фактический код, но я сделал это в Obj-C, и это позволило мне не читать весь файл вначале, просто добавить его в конец:
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); }
Пример кода, который я использовал для добавления массива JSON additioonal в 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);