我用PHP解码JSON字符串时遇到问题,我很确定是什么原因造成的,但不确定如何修复。我将一个转换为JSON的数组放在一个隐藏的文本区域,然后将其与其他信息一起发布到我的PHP脚本中。
下面是一个放置在文本区域中的JSON字符串示例:我使用$("#product_options").val(JSON.stringify(productOptions));
将JSON放置在文本框中。
[{
"optionID": "217",
"optionValueID": ["3"]
}, {
"optionID": "218",
"optionValueID": ["5"]
}, {
"optionID": "223",
"optionValueID": ["8", "11"]
}, {
"optionID": "208",
"optionValue": ["test"]
}, {
"optionID": "209",
"optionValue": ["zxvsdfg"]
}, {
"optionID": "219",
"optionValue": ["2011-02-20"]
}, {
"optionID": "221",
"optionValue": ["22:25"]
}, {
"optionID": "220",
"optionValue": ["2011-02-20 22:25"]
}]
这可以很好地解码,但一旦我发布它并使用$_POST['json_array']
读取PHP中字段的值,它就不会解码。以下是转换为JSON:的整个帖子
{
"full_name": "sdfg",
"phone": "sdfg",
"email": "sdfg",
"notes": "sdgf",
"product_id": "42",
"product_options": "[{"
optionID ":"
217 ","
optionValueID ":["
3 "]},{"
optionID ":"
218 ","
optionValueID ":["
5 "]},{"
optionID ":"
223 ","
optionValueID ":["
8 ","
11 "]},{"
optionID ":"
208 ","
optionValue ":["
test "]},{"
optionID ":"
209 ","
optionValue ":["
zxvsdfg "]},{"
optionID ":"
219 ","
optionValue ":["
2011 - 02 - 20 "]},{"
optionID ":"
221 ","
optionValue ":["
22: 25 "]},{"
optionID ":"
220 ","
optionValue ":["
2011 - 02 - 20 22: 25 "]}]"
}
编辑:
这是我用来解码JSON $productOptions = json_decode($_POST['product_options']);
的PHP代码。
我收到的错误是:Invalid argument supplied for foreach()
,但这是因为我试图在数组从JSON转换后循环。
在与代码斗争了3天后,我发现:json_decode或eval无法处理"这就是报价在帖子字符串中的表现,但当我进行变量转储时,它在浏览器中显示为",所以很难调试。所以为了解决这个问题,我添加了代码:
$_POST['product_options'] = str_replace('"', '"', $_POST['product_options']);
对我来说,这似乎是一个愚蠢的PHP错误:{
更好的方法可能是使用html_entity_decode()
来转换任何html实体,例如:
$_POST['product_options'] = html_entity_decode($_POST['product_options']);
服务器端和客户端仅使用字符串进行通信。
在发布值之前,您可以对该值调用JSON.stringify(),以获得一个有效的可转换字符串,并将其发送到服务器
在获得编码的json之后,您应该使用json_decode()。这样你就可以从字符串中解析出一个PHP变量。链接此处获取更多信息
我的猜测是,您希望使用foreach
来迭代数据结构,但您真正尝试的是对类型为stdClass
的对象进行迭代,但您不能这样做,因为它没有实现Iterator
类。
您可能首先想做的是将json转换为associative array
。您可以通过将json_decode的第二个参数设置为true来实现这一点,如下所示:json_decode($string, true)
当您遇到这样的错误时,使用var_dump
或print_r
查看变量的真实内容及其包含的内容可能会很有用。