在文本区域POST后解码JSON


Decode JSON after POST in textarea

我用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_dumpprint_r查看变量的真实内容及其包含的内容可能会很有用。