Javascript JSON.stringify / PHP json_decode Not working


Javascript JSON.stringify / PHP json_decode Not working

我正在尝试从JS发送一个数组到PHP。

JS:

var json = JSON.stringify(extraFields);
url += "&json="+json;
PHP:

$json = json_decode($_GET['json'], true);
foreach($json as $K=>$V){
    echo "json".$K . "=" . $V ."; ";
}

假设extraFields是一个有效的数组,格式如下:

extraFields['key1'] = 'val1';
extraFields['key2'] = 'val2';
extraFields['key3'] = 'val3';

得到的PHP错误是invalid argument for Foreach

当我循环通过$_GET值并只是回显它们时,PHP显示$_GET['json']的空括号,因此它将其识别为json..

我做错了什么?

对TJ评论的回答

var extraFields = new Array();
                var countFields = THIS.$_FIELDS.length;
                var Row = new Array();
                while(countFields--){
                    var name = THIS.$_FIELDS[countFields]['name'];
                    var id = THIS.$_FIELDS[countFields]['id'];
                    var elemVal = getElmVal(id);
                    extraFields[name] = elemVal;
                    window.alert(name +"="+ elemVal);
                }

两件事:

  1. 你不能只是把JSON转储到URL的末尾,并期望它能正确地传递到服务器。

    至少,您必须对它进行uri编码:

    url += "&json="+encodeURIComponent(json);
    
  2. 你在代码片段中使用extraFields的方式,它是而不是被用作数组。如果您将它创建为数组,那么这些键将不会被序列化。你使用它的方式,创建extraFields的正确方法是:

    extraFields = {}; // NOT `= []` and NOT `= new Array()`
    

    那是一个对象,不是数组。(不要让PHP术语"关联数组"欺骗了你;这个术语是php特有的,与一般意义上的术语"数组"无关。如果你想在JavaScript代码中使用任意的名称/值对,术语是"对象"[有时是"地图"或"字典",但它们都是对象])

    如果在数组中添加非索引属性,JSON.serialize将忽略它们(忽略它们)。对于数字索引的数据,只使用JSON数组([])。为名称/值对使用对象({})