javascript中的JSON序列化和php反序列化

JSON serialization in javascript and php deserialization

本文关键字:php 反序列化 序列化 中的 JSON javascript      更新时间:2023-09-26

你好,我在反序列化javascript中序列化的JSON时遇到问题。我在网页上有表格,每一行都是一个产品(表格中的输入、选择、复选框):

name, price, total_count, ...
name2, price2, total_count2, ...
...

我取了一个表单并用javascript将其序列化(函数ajaxLoad是正常的缩写jQuery函数$.ajax(…),它在其他地方正常工作)

var form = $('#myForm');
form.submit(function(event){
    event.preventDefault();
    ajaxLoad(
        form.attr('action'),
        form.parent(),
        {jsonData : JSON.stringify(form.serializeArray())}
        );
    });

在php中,数据被接收,我的代码如下:

$data = json_decode($jsonData, true);
$this->template->data = print_r($data,1);

它返回类似的东西:

Array
(
    [0] => Array
        (
            [name] => products[0][cor_projectProduct_name]
            [value] => 1ks Replika Kádnerova jáchymovského tolaru stand BJ
        )
    [1] => Array
        (
            [name] => products[0][url]
            [value] => http://some-nice-url.cz
        )
    [2] => Array
        (
            [name] => products[0][cor_projectProduct_ean]
            [value] => 
        )
    [3] => Array
        (
            [name] => products[0][cor_projectProduct_internalCode]
            [value] => 
        )
    [4] => Array
        (
            [name] => products[0][cor_project_id]
            [value] => 6
        )
    [5] => Array
        (
            [name] => products[0][cor_projectProduct_keywordAllowed]
            [value] => 
        )
...

但是我想要一个对象数组。

我也尝试过用form.serialize序列化表单,但返回的结果更糟糕——url编码的字符串,我无法解码。

当我试图通过POST方法将数据作为数组发送,然后从$_POST在php中读取数据时,它起了作用,但由于POST限制,一些数据丢失了,所以最好将其作为序列化字符串发布,但我不知道如何以及如何在php中反序列化它。

编辑:好吧,也许解释得不好,结果我需要的是对象数组:

Array
(
    [0] => stdClass Object
        (
            [cor_projectProduct_name] => 1ks Replika Kádnerova jáchymovského tolaru stand BJ
            [url] => http://www.ceske-mince.cz/ceska_mincovna/1997/replika-kadnerova-jachymovskeho-tolaru-stand/
            [cor_projectProduct_ean] => 
            [cor_projectProduct_internalCode] =>
            [cor_project_id] => 6
            [cor_projectProduct_keywordAllowed] =>
            ...
        )
    [1] => stdClass Object
        (
            [cor_projectProduct_name] => 1ks Replika Kádnerova jáchymovského tolaru stand BJ
            ...
        )
    ...

或者与关联数组相同,

无关紧要

要获得对象而不是数组,请使用

$data = json_decode($jsonData, true);

而不是

$data = json_decode($jsonData, false);

演示:https://eval.in/207258

也许可以看看这个答案。。。

基本上将数组(在json_decode之后)转换为对象。

不需要序列化表单帖子。如果需要处理长数据,可以在php设置中更改post-limit。使用unserialize将序列化数据转换为密钥=>对数组

但是对于json-format中的接收和编码(您使用jsondecode而不首先使用json_encode以json字符串格式格式化任何数组)。

在第一个视图中检查返回的数组是否对键名有效。但如果您只需要从模板对象设置数据属性,则只需要执行$this->template->data = $_POST;

编辑:

拥有一系列产品:

$objArray = array();
foreach($_POST['products'] as $product) {
     $objArray['name'] = $product[cor_projectProduct_name];
     $objArray['url'] = $product[url];
     $objArray['ean'] = $product[cor_projectProduct_ean];
     $objArray['internalCode'] = $product[cor_projectProduct_internalCode];
     ...
}

好吧,我自己想好了怎么做:

在javascript中,除了带数据的行之外,所有相同的内容都必须更改为:

{jsonData : JSON.stringify(form.serialize())}

在PHP中,我可以在调用parse_str()函数后访问接受的数据,所以它应该是这样的:

public function actionSubmitedImportedProducts($jsonData){
    parse_str(json_decode($jsonData));
    $this->template->data = print_r($products,1);
}

天哪,太差劲了:-D。