我可以提取字符但不是JSON字符串的抢占子字符串

时间:2014-02-06 14:24:18

标签: javascript json

我是JSON的新手,但已经阅读了网上的几个教程(例如http://www.copterlabs.com/blog/json-what-it-is-how-it-works-how-to-use-it/)。在我的网站的一个页面上,我生成了一组缩略图,并通过json对其进行编码,如下所示:

<?php //lots of code
$sqlTh = mysqli_query($cxn, "SELECT thumb FROM video WHERE status = 'active'");
$jsonTh = array();
while ($row = mysqli_fetch_assoc($sqlTh)){ 
    $jsonTh[] = json_encode(array($row));
}
?>

然后我声明全局var thumb并使用document.ready(function()来调用我的缩略图加载函数:

<script type="text/javascript">
var thumbs = '<?php echo json_encode($jsonTh) ?>';
</script>
<script type="text/javascript">
$(document).ready(function () {
    loadThumbs();
});
</script>

函数loadThumbs()位于外部文件中......可以提醒JSON字符串,其长度显示如下:

function loadThumbs() {
    alert(thumbs); //No problem
    alert(thumbs.length); //No problem
}

我可以看到JSON字符串......警报输出如下所示:

["[{"thumb":"thumbnail1.jpg"}"]", etc , etc , etc }"]"]
1756 //(string length)

现在我想做的就是看到字符串/数组的每个成员.....我试过警告以下内容:

function loadThumbs() {
    alert(thumbs[2].thumb);
}

但警报输出是“未定义”。然后我尝试使用for循环遍历数组并为数组的每个成员设置变量的解决方案:

function loadThumbs() {
    for (var i = 0, len = thumbs.length; i < len; i++) {
       var th = thumbs[i];
       alert(th);
    }
} 

然而,这会警告数组的所有1756个字符而不是每个.jpg文件名。将功能稍微更改为以下功能不会发出任何警报(根本没有警报框):

function loadThumbs() {
    for (var i = 0, len = thumbs.length; i < len; i++) {
       var th = thumbs[i].thumb;
       alert(th);
    }
} 

我知道一个解决方案是在JSON字符串上使用js split()函数,但我想知道我在哪里出错而不使用split()函数。有人可以对此有所了解吗?我将不胜感激任何帮助......谢谢!

2 个答案:

答案 0 :(得分:1)

我不是PHP专家,但是从你的代码我看到你正在创建一个JSON编码字符串数组,每行一个,然后你JSON编码整个数组,所以你得到的输出就是你的应该期待。

更重要的是,你忘了JSON解码javascript端的字符串。

尝试更改您的代码:

<?php //lots of code
$sqlTh = mysqli_query($cxn, "SELECT thumb FROM video WHERE status = 'active'");
$jsonTh = array();

while ($row = mysqli_fetch_assoc($sqlTh)){ 

    $jsonTh[] = array($row);     //don't encode each row!!

}
?>

<script type="text/javascript">


$(document).ready(function () {
    //use JSON.parse to re-decode on the javascript side
    var thumbs = JSON.parse('<?php echo json_encode($jsonTh) ?>');    

    for (var i = 0, len = thumbs.length; i < len; i++) {
       var th = thumbs[i].thumb;
       alert(th);
    }
} 

</script>

你应该像你期望的那样得到所有拇指的警报。 请注意,如果Thumb属性预计包含撇号,则必须在js侧转义它们。

答案 1 :(得分:0)

在您的示例中,您的语法不正确:

["[{"thumb":"thumbnail1.jpg"}"]", etc , etc , etc }"]"]

确保引号围绕标识符和值:

"thumb": "thumbnail1.jpg"

在你的例子中:

[[{"thumb":"thumbnail1.jpg"}], "etc" , "etc" , "etc" }]]

永远不要在大括号或括号旁边加上引号......

DON'T DO THIS: "[" "]" OR "{" "}"

祝JSON好运!