【问题标题】:File saving to server as invalid JSON文件作为无效 JSON 保存到服务器
【发布时间】:2014-12-17 09:05:43
【问题描述】:

我正在使用 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 转换为的任何内容。我还尝试对 ajax 的 data: 部分使用 JSON.stringify({json: theJsonBeingWritten}) 但无济于事。我也尝试过使用 $.post("json.php", theJsonBeingWritten);而不是 $.ajax 但这也不起作用。我还将内容类型设置为 Content-type: application/json"。

【问题讨论】:

  • 在哪里您收到错误消息,表明您的 JSON 文件无效?显示尝试读取它的代码。您是否使用 hexeditor 检查了您的 .json 文件?无效的字符串编码只会产生 null 值。
  • 你是怎么得到“theJsonBeingWritten”的?
  • 在记事本(或者我的首选notepad++)中打开.json文件,查看内容是否为有效的json。
  • 从写入服务器的文件复制/粘贴时,我从在线验证器收到错误。但这不是肉眼可以看到的东西。这就像一个底层编码或其他东西。 theJsonBeingWritten 来自一个字符串,该字符串在结构中被格式化为看起来像 json ......然后被字符串化并解析为实际上是 json。但同样......它确实产生了有效的 json......这是问题所在。
  • 验证者说什么?就像上面的评论一样,您可以尝试复制/粘贴到文本编辑器中,该编辑器可以为您重新编码内容以查看是否会通过验证。

标签: php ajax json encoding server-side


【解决方案1】:

fopen 没问题..

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

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

【讨论】:

    【解决方案2】:

    所以我终于能够在 JSON 中发现鬼鬼祟祟的小符号。这些没有出现在任何文本编辑器或十六进制编辑器或验证器中。只有在从原始 URL 中看到 JSON 之前,才会出现抑扬符符号。尽管有任何强制编码的尝试,PHP fwrite() 函数中的某些东西还是强制它们输入。无论如何,在使用 fwrite() 之前使用以下内容从 PHP 脚本中的 json 中删除字符就可以了:

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

    【讨论】:

      猜你喜欢
      • 2019-08-11
      • 1970-01-01
      • 2014-10-14
      • 2016-01-11
      • 1970-01-01
      • 2013-04-24
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多