2D json数组错误地转换为字符串

时间:2014-03-13 06:58:01

标签: javascript php html ajax json

我有一个外部数组,里面有2个元素。 2个元素中的每一个都是一个数组。所以它是一个二维数组。

以下是数组的创建方式:

 $outerArray = array();
 $nestedArray =  array("first", "second", "third", "fourth");
 $outerArray[] = $nestedArray;
 $nestedArray_2 =  array("first", "second", "third", "fourth");
 $outerArray[] = $nestedArray_2;

然后我按如下方式存储这个数组:

 $jsonArray = json_encode($outerArray);

 // USE 'echo' TO PUT THIS array INTO A HIDDEN input FIELD ON THE PAGE
 echo "document.getElementById('jsonArray').value = $jsonArray;";  


 // LETS ECHO THE NESTED ARRAY TO VERIFY IT WAS CONSTRUCTED CORRECTLY
 echo $jsonArray;

这是HTML隐藏元素' jsonArray'在我的档案中:

  <input type="hidden" id="jsonArray" />

我在上面做的那个回声向我展示了数组看起来像这样:

  [["first","second","third","fourth"],["first","second","third","fourth"]]

这一切都很好。现在很清楚,隐藏的输入字段中存储了一个有效的2D json数组。

然后我用数组执行以下操作 - 我将它存储在会话中,重定向到另一个文件,然后提取然后回显2D数组:

   var xmlhttp=new XMLHttpRequest();
   xmlhttp.onreadystatechange=function()
   { 
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
      {
          // SEE NOTE #1 BELOW ABOUT WHAT THIS SHOWS IN THE ALERT() BOX
          alert("The xmlhttp.responseText is: " + xmlhttp.responseText);


          window.location = "theViewer.php";
      }
   }

   var arg = "theStored2dimensionArrayAsJson=" 
                   + document.getElementById('jsonArray').value;
   xmlhttp.open("POST", "handler.php", true);
   xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
   xmlhttp.send(arg);

这样做,它将json编码的二维数组发送到handler.php。而且所有handler.php都在$ _SESSION中保存json编码的二维数组:

   // in handler.php
   $_SESSION['jsonEncoded2D_Array'] = $_POST['theStored2dimensionArrayAsJson'];

   // echo out the array so it appears in the xmlhttp.responseText
   echo $_POST['theStored2dimensionArrayAsJson'];


   // NOTE #1 -- THIS IS WHAT IS DISPLAYED IN THE xmlhttp.responseText
   handler.php, the jsonEncoded2D_Array is:          
        first,second,third,fourth,first,second,third,fourth

在alert()框中显示xmlhttp.responseText后,我重定向到theViewer.php。 我从SESSION中检索2D数组并将其回显:

   // INSIDE theViewer.php
   $jsonified_2D_Array = $_SESSION['jsonEncoded2D_Array']; 

但是,当我回应出“阵列”时,我刚刚从SESSION中检索到,它现在是一个字符串,而不是一个数组:

   // THE echo SHOWS THE 2D ARRAY HAS BEEN COVERTED TO A TEXT STRING
   // AND IS NO LONGER AN ARRAY
   echo "Okay, here is the 2D array:<br />" . $jsonified_2D_Array;

上面回声的输出是:

    Okay, here is the 2D array:
    first,second,third,fourth,first,second,third,fourth

我不明白。如果你看一下上面的代码,我将它放入一个隐藏的输入字段后回显这个数组,它看起来像正确,就像一个2D数组。这是之后我将其转换为JSON。

然后我从该隐藏字段中取出JSON-ified 2D数组,将其通过Ajax传递给handler.php以便保存在SESSION中,然后将其从theViewer.php中的SESSION中取回 - 和它不再是二维数组 - 它现在只是一个文本字符串。

我需要将这个2D数组保持为2D数组而不是字符串。

这可能吗?我需要 theViewer.php中的2D数组(不是字符串化数组)。

我在theViewer.php中的字符串化数组上尝试了JSON.parse()和eval(),它停止了代码执行,但没有帮助。

1 个答案:

答案 0 :(得分:0)

$asd = '[["first","second","third","fourth"],["first","second","third","fourth"]]';
var_dump(json_decode($asd));

输出

array(2) {
  [0]=> array(4) {
        [0]=>
        string(5) "first"
        [1]=>
        string(6) "second"
        [2]=>
        string(5) "third"
        [3]=>
        string(6) "fourth"
  }
  [1]=> array(4) {
        [0]=>
        string(5) "first"
        [1]=>
        string(6) "second"
        [2]=>
        string(5) "third"
        [3]=>
        string(6) "fourth"
  }
}

所以json_decode()就是答案

编辑:所以答案就是把它包装在这样的引号里面

echo "document.getElementById('jsonArray').value = \'$jsonArray\';"; 

所以ajax会将其视为字符串,不会删除括号。