【问题标题】:php json_encode not escaping new linesphp json_encode 没有转义新行
【发布时间】:2012-07-01 03:40:26
【问题描述】:

我遇到了一些关于 json_encode 的问题。

当我对具有新行的数组进行 json_encode 时,它​​不会转义新行,而是删除 \ 并保留 n。

ex: $array = array('name'=> "some text \n\r text");
$results = json_encode($array);

它正在将some text nr text 保存在数据库中。

我正在使用php 5.3.8

编辑:

这是我正在使用的原始代码

$attr = array();
for($i=0; $i < count($_POST['key']); $i++){
    $attr[$_POST['key'][$i]] = $_POST['value'][$i];
}
echo json_encode(array('custom' => $attr));

这些POST 值来自表单。

【问题讨论】:

  • 您确定是 json_encode 导致了问题吗?如果你 print_r($results); 你会得到什么?在浏览器中出来?啊,应该是\r\n...
  • Cannot reproduce. 你确定要查看原始输出吗?
  • 1) 不应该是\r\n,2) 如何将该字符串发送到数据库?您是否正确引用/转义了该值(或至少使用addslashes())?
  • 和我一起工作正常,相同的 PHP 版本。在插入数据库之前您还进行了哪些其他操作?
  • 谢谢,当我执行 print_r($array) 时,新行输出很好,如果我执行 json_encode() 之后,json_decode() 输出会像上面那样没有换行符..

标签: php json


【解决方案1】:

Newlines are not valid characters inside of JSON strings。这是预期的行为:

字符

除 " 或 \ 或控制字符之外的任何 Unicode 字符

  • \"
  • \
  • /
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u 四位十六进制数

JSON 将这些控制字符转义到列表中。

所以现在我们有了'\n'(字面意思是一个反斜杠后跟'n'),如果没有正确转义,它将在数据库中保存为n就是您遇到的问题。

解决方案

使用准备好的语句正确转义您存储在数据库中的字符串中的所有斜杠。这会将它们保存为'\n',您可以在检索数据时将其转换为"\n"

【讨论】:

  • 有什么建议可以代替他吗?
  • @andrewtweber:正确使用准备好的语句?
  • 是的,但这仍然会将文字“\n”字符转义为转义序列 '\n'...数据库的意思不是“json_encode 的问题”。也可能是数据库查看器 logicsinc 正在使用不支持正确显示 \n ;)
  • @pebbl:不,正如我所说,这是预期的行为。 JSON 不支持换行符,因此它将其转换为'/n'。如果他使用准备好的语句,该序列将被保存,并且一旦检索到它就可以恢复到"/n"
  • @Truth 啊好吧我错过了将它转换为/n的部分,我以为它只是删除了`\`
【解决方案2】:

我不相信 json_encode 是你的问题。我的猜测是您的数据库将 \ 解释为转义字符,因此它只是将它们剥离出来。

要解决这个问题,只需使用 addslashes 转义转义字符:

$results=addslashes($results);

【讨论】:

  • 此解决方案有效: order = JSON.parse( '' );
  • 我对此表示赞同,因为 real_escape_string 解决了我的问题
  • 我搜索了很多,这个是最好的 :) 谢谢 :)
【解决方案3】:

您可以手动转义它们:

$array = array('name'=> "some text \n\r text");

$results = json_encode(array_filter($array, function($arr) use ($array){
        return preg_replace('~\\[nrtfd]~', '\\\\$1', $arr);
}));

print_r($results);

您可以扩展自己的 json_encode 函数,并将您对 json_encode 的使用替换为 my_json_encode

function my_json_encode($json){
    $results = json_encode(array_filter($json, function($arr) use ($array){
        return preg_replace('~\\[nrtfd]~', '\\\\$1', $arr);
    }));

    return $results;
}

print_r($results);

仅供参考,以上返回:{"name":"some text \n\r text"} 而不是 {"name":"some text nr text"}

【讨论】:

  • 我无法手动执行此操作。我正在使用 json_encode 数字位置。
【解决方案4】:

我发现了这个问题。它不在 json_encode 问题中。保存到数据库时出错。

问题是在服务器中启用了 ma​​gic_quotes_gpc。在我的应用程序中,如果启用了magic_quotes,我将删除斜线。

我禁用了 ma​​gic_quotes_gpc。现在工作正常。

感谢每一个人。

【讨论】:

  • 你是如何禁用它的?
【解决方案5】:

我使用这个命令来清除反斜杠。

$info = file_get_contents('my_file.txt');
**$info = str_replace(array("r\n","\n", "\r"), "", $info);**    
$info = json_decode($info);

【讨论】:

    【解决方案6】:

    您可以按照 PHP 手册中的说明使用 JSON_PRETTY_PRINT

    https://www.php.net/manual/function.json-encode.php

    【讨论】:

      【解决方案7】:

      您可以使用PHP_EOL 换行。在哪里包含新行取决于您想要的方式。在下面的情况下,我需要在最后一个右方括号和每个大括号之后换行:

      tit1: {
      "prop1" : [ "", "", []], 
      "prop2" : [ "", "", []]
      }, 
      tit2: {
      "prop1" : [ "", "", []], 
      "prop2" : [ "", "", []]
      }
      

      功能是

      $jsonDataTxt = $this->own_format_json($jsonData);
      file_put_contents("C:/Users/mm/Documents/Data.json", $jsonDataTxt);
      
      
      function own_format_json($json, $html = false) {
              $tabcount = 0; 
              $result = ''; 
              $bnew = 0;
              $brack=0;  
              $tab = "\t"; 
              $newline = PHP_EOL; 
              for($i = 0; $i < strlen($json); $i++) { 
                  $char = $json[$i]; 
                  if($char!==',' && $bnew===1) { $bnew=0; $result.=  $newline; } //insert new line after ], which is not proceeded by ,
                  switch($char) { 
                      case '{': 
                          $tabcount++; 
                          $result .= $char . $newline . str_repeat($tab, $tabcount); 
                          break; 
                      case '}': 
                          $tabcount--; 
                          $result = trim($result) . $newline . str_repeat($tab, $tabcount) . $char . $newline; 
                          break; 
                      case '[': 
                          $brack++; 
                          $result .= $char;// . $newline . str_repeat($tab, $tabcount); 
                          break; 
                      case ']': 
                          $brack--;
                          $result .= $char;// . $newline . str_repeat($tab, $tabcount); 
                          if($brack===0) { $bnew=1; }
                          //echo "<br><br> case  ]  char=".$char.',   brack='.$brack. ",  bnew=".$bnew.",   result=".$result ; 
                          break; 
                      case ',': 
                          $result .= $char;// . $newline . str_repeat($tab, $tabcount); 
                          if($bnew===1) { $bnew=0; $result.=  $newline; } //insert new line after ],
                          break; 
                      case '"': 
                          $result .= $char; 
                          break; 
                      default: 
                          $result .= $char; 
                  } 
              } 
          return $result; 
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-01
        • 2016-09-23
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-12
        相关资源
        最近更新 更多