php json_encode不转义新行

ukxgm1gy  于 2022-12-10  发布在  PHP
关注(0)|答案(8)|浏览(225)

我遇到了一些json_encode问题。
当i 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值来自表单。

v64noz0r

v64noz0r1#

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

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

  • \”
  • \
  • /
  • \B
  • 关闭
  • 已删除
  • 文件夹
  • 文件夹
  • \u四个十六进制数字

JSON将这些控制字符转义到列表中的控制字符中。
所以现在我们有了'\n'(字面意思是反斜杠后面跟'n'),如果没有正确转义,它将在数据库中保存为n

解决方案

使用预处理语句对数据库中存储的字符串中的所有斜杠进行正确转义,将其保存为'\n',检索数据时可以将其转换为"\n"

wqnecbli

wqnecbli2#

我不认为json_encode是您的问题。我猜您的数据库将\解释为转义字符,所以它只是简单地将它们去掉。
要解决此问题,只需使用addslashes对转义字符进行转义:

$results=addslashes($results);
nfg76nw0

nfg76nw03#

您可以手动退出它们:

$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"}

xzlaal3s

xzlaal3s4#

我解决了这个问题。它不是在json_encode问题。它是一个错误,而保存到数据库。
问题是在服务器中启用了magic_quotes_gpc。在我的应用程序中,如果启用了magic_quotes,我将剥离斜杠。
我禁用了magic_quotes_gpc。现在工作正常。
谢谢你们

rm5edbpk

rm5edbpk5#

您可以按照PHP手册中的描述使用JSON_PRETTY_PRINT
https://www.php.net/manual/function.json-encode.php

8fq7wneg

8fq7wneg6#

你可以使用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; 
   }
nafvub8i

nafvub8i7#

我使用此命令清除反斜杠。

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

s4n0splo8#

我发现最简单的解决方案是使用JSON_UNESCAPED_UNICODE(如果需要,还可以使用其他标志)。
关于原始问题:

<?php
$tmp = array();

$tmp[1] = "test";
$tmp["ok"] = "this
seems to be
a
multiline
nightmare,
but
we
can manage it";

$conv = json_encode($tmp,JSON_UNESCAPED_UNICODE);
echo $conv;
?>

其输出

{"1":"test","ok":"this\r\nseems to be\r\na\r\nmultiline\r\nnightmare,\r\nbut\r\nwe\r\ncan manage it"}

相关问题