【问题标题】:Javascript JSON.stringify / PHP json_decode Not workingJavascript JSON.stringify / PHP json_decode 不工作
【发布时间】:2014-03-19 14:12:33
【问题描述】:

我正在尝试从 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);
                }

【问题讨论】:

  • 从 JS 发送到 PHP 时检查 headers,当你使用json_decode 时,检查 json_decode 是否返回 null。如果是这样,echo json_last_error_msg(); 看看有什么问题。
  • 你如何创建 extraFields= {}? = []?
  • @T.J.Crowder 查看我的编辑
  • @Adelphia:那是问题的一部分。您将它用作对象,而不是数组,并且非数组属性不会被序列化。请参阅我的回答中的第 2 项。

标签: javascript php json stringify


【解决方案1】:

两件事:

  1. 您不能只在 URL 的末尾转储 JSON 并期望它正确地通过服务器。

    至少,您必须对其进行 URI 编码:

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

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

    这是一个对象,而不是一个数组。 (不要让 PHP 术语“关联数组”欺骗您;该术语是 PHP 特定的,与一般意义上的术语“数组”无关。如果您想要 JavaScript 代码中的任意名称/值对,则该术语是“对象”[或者有时是“地图”或“字典”,但它们是对象]。)

    如果您将非索引属性添加到数组,JSON.serialize 将忽略它们(将它们排除在外)。仅将数组 ([]) 与 JSON 一起用于数字索引数据。将对象 ({}) 用于名称/值对。

【讨论】:

  • 谢谢,TJ.. 你觉得使用 javascript 的 escape() 有问题吗?
  • @Adelphia:是的;这不是escape 的用途。 escape 与 URI 编码无关。
猜你喜欢
  • 2017-02-24
  • 1970-01-01
  • 2019-05-17
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
相关资源
最近更新 更多