PHP json_encode 反斜杠和数组名称的问题

Posted

技术标签:

【中文标题】PHP json_encode 反斜杠和数组名称的问题【英文标题】:PHP json_encode Problem with Backslash and Array Name 【发布时间】:2011-07-13 10:33:14 【问题描述】:

我正在将一些 postgresql 数据转换为 php json_encode,但我有一些问题:

json_encode 为我数据中的所有斜杠添加一个反斜杠。

在描述中出现段落标签的结尾,我认为是因为反斜杠问题...

我不希望我的数组位于以索引“0”命名但名称为“attach:”的对象内

我的 JSON 输出:

"arns":["arn":"CSC-ECN-NAUB109","problem":"description problem<\/p>",
"solution":"solution description<\/p>",
   "0":["name":"jquery.png","path":"http:\/\/arn.test.pt\/uploads\/CSC-ECN-NAUB109\/jquery.png"]] 

我的密码:

<?php 

require('includes/connection.php');

$modelos_info = (isset($_GET['models'])) ? $_GET['models'] : "none";

if($modelos_info != "none")

$sth = $dbh->query("SELECT * FROM arn_info JOIN upload2 ON (arn_info.arn=upload2.id_arn) WHERE modelos LIKE '$modelos_info ;%' OR modelos LIKE '%; $modelos_info ;%' ");

$sth->setFetchMode(PDO::FETCH_ASSOC);

$response = array();
$posts = array();

while($row = $sth->fetch())
 

$arn=$row ['arn'];
$problem=$row['problem'];
$solution=$row['solution'];
$name=$row['name'];
$path=$row['path'];

$posts_anexos['attach'] = $posts2;

$posts2[] = array('name'=> $name , 'path'=> 'http://arn.test.pt/' .$path);
$posts[] = array('arn'=> $arn , 'problem'=> $problem , 'solution'=> $solution, $posts2 );
 

$response['arns'] = $posts;

$fp = fopen('arns.json', 'w');

fwrite($fp, json_encode($response));

fclose($fp);

echo json_encode($response);


?>

谢谢

【问题讨论】:

【参考方案1】:

对于第一点,如果我尝试这样做:

$str = "this / string";
var_dump(json_encode($str));

我明白了:

string '"this \/ string"' (length=16)

还有反斜杠。

查看json.org,似乎 JSON 标准定义了字符串内部的斜线应该被转义。

所以,json_encode() 似乎在做正确的事。

如果您不想转义这些斜杠,那么您不需要有效 JSON,并且不应使用 json_encode


对于第二点,现在,你不应该使用这个:

$posts[] = array(..., $posts2 );

相反,您应该使用:

$posts[] = array(..., 'attach' => $posts2 );

这样,数组的最后一个元素将具有“附加”名称。

【讨论】:

是的,你在两点上是对的,有什么建议可以改用 json_encode 吗? 没有真正的建议,没有:使用 valid-JSON 可能比重新发明***、尝试重写某些东西更好。 或者如果你使用 PHP >= 5.3.0,使用json_encode($posts, JSON_FORCE_OBJECT) 谢谢,不,我使用的是 5.2.5。我用其他帖子解决了这个问题, $json_encoded_string = json_encode($response); $json_encoded_string = str_replace("\\/", '/', $json_encoded_string); 正斜杠可以转义,然后不必转义(就像你可以写一个'a'为'\u0061'。反斜杠和双引号需要被转义(因为它们在语法的其他部分很重要(即转义和关闭字符串以及控制字符),但其他字符不需要。RFC中给出的语法 - ietf.org/rfc/rfc4627.txt - 有它是明确的。

以上是关于PHP json_encode 反斜杠和数组名称的问题的主要内容,如果未能解决你的问题,请参考以下文章

json_encode() 转义 / 带有 \ [重复]

php json_encode输出为空问题

如何删除 json_encode() 函数上的反斜杠?

为啥 json_encode 添加反斜杠?

如何使用json_encode回显没有反斜杠的值[重复]

json_encode() 转义正斜杠