Я сохраняю JSON на сервер с помощью сценария PHP следующим образом:
<?php
$json = $_POST['json'];
$file = fopen('jsonfile.json', 'wb');
fwrite($file, $json);
fclose($file);?>
Сценарий считывает существующий файл jsonfile.json и записывает в него новый json … затем сохраняет его на сервере. Но это приводит к неверным JSON. Я знаю, что фактический json действительно действителен, потому что если я использую document.write (), чтобы показать json в браузере, и скопировать / вставить этот json в валидатор, то это идеально. Но фактический json в файле, который был записан на сервер, недопустим и, следовательно, непригоден для любой программы.
Я предполагаю, что это имеет отношение к кодированию. Я попытался использовать заголовки, которые обеспечивают UTF-8 в сценарии php, но безрезультатно.
JSON выглядит так:
{
"name":"First Name",
"children":[
{
"name":"Second Name",
"children":[
{
"name":"Third Name",
"children":[
{
и так далее….
Опять же, это действительно JSON, так как при использовании document.write () и вставке в валидатор это нормально. Если бы я показал json в файле, который был записан на сервер, он выглядел бы одинаково. Как будто есть некое скрытое форматирование, которое мы не видим, не позволяющее валидатору передавать его и, очевидно, не позволяющее программам его запускать.
Вот AJAX для отправки JSON в PHP-скрипт:
$.ajax({
url: 'json.php',
data: {
json: theJsonBeingWritten
},
dataType: "json",
type: "POST"});
Это успешно записывает файл на сервер, но что-то не так с форматом / символами (?)
Я также попытался добавить processData: false в раздел AJAX, чтобы остановить преобразование в то, во что превращает мой json PHP. Я также попытался использовать JSON.stringify ({json: theJsonBeingWritten}) для раздела data: ajax, но безрезультатно. Я также попытался использовать $ .post («json.php», theJsonBeingWritten); вместо $ .ajax, но это также не сработало. Я также установил тип содержимого в Content-type: application / json «.
Ничего плохого в fopen ..
$a = fopen("data.json", "w");
fwrite($a,$json);
fclose($a);
это запишет любую строку $ json в файл data.json
Так что я наконец-то смог обнаружить маленькие хитрые символы в JSON. Они не появлялись ни в каком текстовом редакторе, или в hex-редакторе, или в валидаторе. Только пока не увидели JSON из необработанного URL-адреса, появились символы обхода. Что-то в функции PHP fwrite () вызывало их, несмотря на любые попытки принудительного кодирования. В любом случае, с помощью следующего для удаления символов из json в сценарии PHP до использования fwrite () удалось добиться цели:
$string = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string);