2014-09-24 357 views
0

我在下面的代码中遇到了一些麻烦。控制台数收益:如何避免从PHP返回的JSON中的反斜杠?

"returningList{"view":0,"new":1,"random":1} result: "{\"view\":0,\"new\":1,\"random\":1}"" 

正如你可以看到它的收单反斜线,使其不再JSON,尽管指定datatype : 'json'

问题似乎发生在从PHP读回javascript的结果,因为如果我在写回$jsonArr到MySQL之前回显SQL数据显示正确的字符串(即没有反斜杠)。

请帮忙,因为这种明显的疯狂真的让我兴奋起来。我想要做的就是获取我的数据 - 在我的实际代码中,我通常不会返回作为数据传入的JSON,但这里只需证明这一点就足够了。我认为'json'数据类型意味着它会接受回声JSON而不会破坏它。

对于以下直言不讳,但为了回应类似的问题,我看到人们只是说“它逃避了引号”,就好像那个回答了这个问题 - 在这种情况下,至少它似乎没有:显然(AFAIK)是反斜杠的来源,但引号是JSON语法的一部分(它知道它是期望的),而不是字段内容的一部分,所以它们显然不应该被转义。我需要一个解决方案请。谢谢。

window.newGot = listBuild({ 
    'view' : 0, 
    'new' : 1, 
    'random' : 1 
}); 

function listBuild(options) 
    //Fill the new list. 
    return $.ajax({ 
     type : "POST", 
     url : "./php/getList.php", 
     cache : false, 
     data : { 
      options : JSON.stringify(options) 
     }, 
     datatype : "json" 
    }).then(function(jsonList) { 
     console.log('returningList' + JSON.stringify(options) + ' result: ' + JSON.stringify(jsonList)); 
     return jsonList; 
    }); 
} 

这里的php文件内容:

<?php 
$options = json_decode($_POST['options'], true); 
$jsonArr = json_encode($options); 
echo $jsonArr; 
+1

的斜线不会引起任何问题,这是相当正常的,因为据我所知? – adeneo 2014-09-24 18:10:49

+2

为什么您将JSON作为字符串传递给'data',然后在服务器端对其进行解码,是没有意义的? – adeneo 2014-09-24 18:12:23

+0

@adeneo - 我也有点困惑,为什么你要处理的数据也是这种感觉 - 你不能把它作为一个对象,并允许AJAX函数来处理转换? – 2014-09-24 18:14:08

回答

1
无论

真实生成JSON可能是编码双,例如

$arr = array(); 
foreach($data as $foo) { 
    $arr[] = json_encode($foo); 
} 
echo json_encode($arr); 

在输出到客户端之前,JSON编码应该是执行的最后一步。

例如

$foo = 'This is a string'; 
$foo_step1 = json_encode($foo); // "This is a string" 
$foo_step2 = json_encode($foo_step1); // "\"This is a string\"" 
0

根据其中的问题是,这可能是因为你透过JSON.stringify,你尝试解析它作为JSON呢?

如果您包含jquery库,那么Jquery具有以下内容,否则浏览器还有一个: $。parseJSON()

http://api.jquery.com/jquery.parsejson/

其他问题可能是因为你是双编码它

还通过验证运行它,这不是有效的代码

http://jsonlint.com/

“returningList {“view”:0,“new”:1,“random”:1} result:“{\”view \“:0,\”new \“:1,\”random \“:1}”“

这是我所期待的JSON看起来像

{ 
"returningList": { 
    "view": 0, 
    "new": 1, 
    "random": 1 
}, 
"result": { 
    "view": 0, 
    "new": 1, 
    "random": 1 
} 

}

+0

Re“那不是有效的代码”什么是无效的代码?请不要将我生成的控制台输出与我想要的echo或返回结果混淆。控制台输出是用于调试的,任何类似的东西都可能是有效的,纯属巧合。 – SteveC 2014-09-25 01:43:17

+0

对不起 - 我的意思是任何相似的(字面意思)整个控制台输出到有效的JSON是巧合。 – SteveC 2014-09-25 01:53:09

0

显然jsonList是JSON字符串,而不是解码的对象,它代表。所以当你打电话给JSON.stringify()时,你需要重新编码字符串。

当您指定dataType: 'json'时,jQuery应该自动解码响应。我知道它在success:选项中指定回调时执行此操作,但在您使用.then()时看起来不会这样做。请尝试使用.done()代替。

就这样说,我试图在jsfiddle重现你的结果,而不是。

http://jsfiddle.net/barmar/53jthkyu/4/