14

我在使用 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值来自表单。

4

7 回答 7

10

换行符不是 JSON 字符串中的有效字符。这是预期的行为:

字符

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

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

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

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

解决方案

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

于 2012-06-29T15:36:30.113 回答
6

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

为了解决这个问题,只需使用addlashes转义转义字符:

$results=addslashes($results);
于 2012-06-29T15:33:50.100 回答
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_encodeto的使用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"}

于 2012-06-29T15:35:55.177 回答
1

I figured out this issue. it is not in json_encode problem. it is an error while saving to database.

The problem is magic_quotes_gpc enabled in server. in my application if magic_quotes enabled i am striping the slashes.

i disabled magic_quotes_gpc. working fine now.

Thanks for every body.

于 2012-06-30T04:10:57.613 回答
1

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

$info = file_get_contents('my_file.txt');
**$info = str_replace(array("r\n","\n", "\r"), "", $info);**    
$info = json_decode($info);
于 2021-11-05T05:34:41.363 回答
1

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

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

于 2021-12-05T08:28:46.143 回答
0

你可以用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; 
   }
于 2016-09-04T17:45:47.300 回答