文件保存到服务器为无效JSON

时间:2014-12-16 17:08:26

标签: php ajax json encoding server-side

我使用PHP脚本将json保存到服务器,如下所示:

<?php

$json = $_POST['json'];
$file = fopen('jsonfile.json', 'wb');
fwrite($file, $json);
fclose($file);


?>

该脚本读入现有的jsonfile.json文件并将新的json写入其中...然后将其保存到服务器。但这会导致无效的json。我知道实际的json确实有效,因为如果我使用document.write()在浏览器中显示json,并将json复制/粘贴到验证器,那就完美了。但是,已写入服务器的文件中的实际json无效,因此无法用于任何程序。

我认为它有一些与编码有关的东西。我已经尝试使用在PHP脚本中强制执行UTF-8的标头,但无济于事。

json看起来像这样:

{  
   "name":"First Name",
   "children":[  
      {  
         "name":"Second Name",
         "children":[  
            {  
               "name":"Third Name",
               "children":[  
                  { 

依旧......

同样,这是有效的JSON,就像使用document.write()并粘贴到验证器中一样。如果我要在已写入服务器的文件中显示json,它看起来会相同。这就像有一些隐藏的格式,我们看不到不允许验证器通过它,显然不允许程序运行它。

这是将json发布到php脚本的AJAX:

$.ajax({
         url: 'json.php',
         data: {
         json: theJsonBeingWritten
         },
         dataType: "json",
         type: "POST"
         });

这成功地将文件写入服务器,但格式/字符有问题(?)

我还尝试将processData:false添加到AJAX部分,以便停止转换为PHP将json转换为的内容。我也尝试使用JSON.stringify({json:theJsonBeingWritten})来获取数据:ajax的部分,但无济于事。我也尝试过使用$ .post(“json.php”,theJsonBeingWritten);而不是$ .ajax但这也没有用。我还将content-type设置为Content-type:application / json“。

2 个答案:

答案 0 :(得分:0)

fopen没什么问题..

$a = fopen("data.json", "w");
fwrite($a,$json);
fclose($a);

这会将任何字符串$ json写入文件data.json

答案 1 :(得分:0)

所以我终于能够发现JSON中那些偷偷摸摸的小符号。这些没有出现在任何文本编辑器或十六进制编辑器或验证器中。只有在看到原始URL中的JSON之后才会出现抑扬符号。尽管有任何强制编码的尝试,但PHP fwrite()函数中的某些东西正在强制执行这些操作。无论如何,在使用fwrite()之前使用以下命令从PHP脚本中删除json中的字符就可以了:

$string = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $string);