-1

我正在使用 fancytree 通过 ajax 发送数据。

$("#save").click(function(e){
            e.preventDefault();

            var tree = $("#tree").fancytree("getTree").rootNode;
            var data = tree.toDict(true);
            data = JSON.stringify(data);
            $.ajax(
            { 
                type: "POST",
                data :  { "data": data },
                contentType: "application/json",
                success: function(data) {
                    $('#alert').empty().append(data);
                }
            });
        });

JSON 数据是以下格式。为了操作数据,我需要重申以下 JSON 对象。

{
"expanded":true,
"key":"root_1",
"selected":false,
"title":"root",
"children":
[
    {"key":"p_1","selected":false,"title":"Animal Meat"},
    {"key":"p_2","selected":false,"title":"Animal Product"},
    {"folder":true,"key":"p_3","selected":false,"title":"Beverage","children":  
    [
        {"key":"2","selected":false,"title":"Tea"},
        {"key":"3","selected":false,"title":"Coffee"},
        {"key":"4","selected":false,"title":"Water"}
    ]},
    {"folder":true,"key":"p_4","selected":true,"title":"Cereal","children": 
    [
        {"key":"6","selected":true,"title":"Porridge"}
    ]},
    {"folder":true,"key":"p_5","selected":false,"title":"Dairy Product","children":
    [
        {"key":"7","selected":false,"title":"Cheese"},
        {"key":"8","selected":false,"title":"Curd"},
        {"key":"10","selected":false,"title":"Milk"},
    ]}
]}

Laravel 中的以下函数处理此请求。

public function storePreference(Request $request)
    {
        $data = $request->getContent();

        $data = urldecode($data);

        foreach($data['children'] as $child)
        {
           $key      = $child['key'];
            $selected = $child['selected'];
            $title    = $child['title'];

            printf("Key: %s, selected: %s, title: %s\n", $key, $selected ? "true" : "false", $title);
        }
    }

我需要以下输出:

Key: p_1, selected: false, title: Animal Meat
Key: p_2, selected: false, title: Animal Product
Key: p_3, selected: false, title: Beverage
Key: 2, selected: false, title: Tea
Key: 3, selected: false, title: Coffee
Key: 4, selected: false, title: Water
Key: p_4, selected: true, title: Cereal
Key: 6, selected: true, title: Porridge
Key: p_5, selected: false, title: Dairy Product
and so on...

我正在使用 fancytree 在 Laravel 5 中发送这些数据。

任何帮助将非常感激。

4

2 回答 2

1
$json = <<<JSON
{
"expanded":true,
"key":"root_1",
"selected":false,
"title":"root",
"children":
[
    {"key":"p_1","selected":false,"title":"Animal Meat"},
    {"key":"p_2","selected":false,"title":"Animal Product"},
    {"folder":true,"key":"p_3","selected":false,"title":"Beverage","children":  
    [
        {"key":"2","selected":false,"title":"Tea"},
        {"key":"3","selected":false,"title":"Coffee"},
        {"key":"4","selected":false,"title":"Water"}
    ]},
    {"folder":true,"key":"p_4","selected":true,"title":"Cereal","children": 
    [
        {"key":"6","selected":true,"title":"Porridge"}
    ]},
    {"folder":true,"key":"p_5","selected":false,"title":"Dairy Product","children":
    [
        {"key":"7","selected":false,"title":"Cheese"},
        {"key":"8","selected":false,"title":"Curd"},
        {"key":"10","selected":false,"title":"Milk"}
    ]}
]}
JSON;

$data = json_decode($json, true);

foreach ($data['children'] as $child) {
    $key      = $child['key'];
    $selected = $child['selected'];
    $title    = $child['title'];

    printf("Key: %s, selected: %s, title: %s\n", $key, $selected ? "true" : "false", $title);
}

这将输出:

Key: p_1, selected: false, title: Animal Meat
Key: p_2, selected: false, title: Animal Product
Key: p_3, selected: false, title: Beverage
Key: p_4, selected: true, title: Cereal
Key: p_5, selected: false, title: Dairy Product

更新:我在示例中修改了 JSON,因为在撰写本文时原始帖子中的 JSON 无效(例如:原始 JSON 中的倒数第二行包含尾随逗号)。

Laravel 方法:

public function storePreference(Request $request)
{
    $dataString = $request->getContent();
    $dataString = urldecode($data);
    $dataString = json_decode($dataString, 'data=');

    $data = json_decode($dataString, true);

    foreach($data['children'] as $child)
    {
       $key      = $child['key'];
        $selected = $child['selected'];
        $title    = $child['title'];

        printf("Key: %s, selected: %s, title: %s\n", $key, $selected ? "true" : "false", $title);
    }
}
于 2015-04-20T19:10:52.430 回答
0

我需要从 $data 字符串中删除“data=”并使用 json_decode。

public function storePreference(Request $request)
    {
        $data = $request->getContent('data');

        $data = urldecode($data);
        $data = substr($data, 5);
        $data = json_decode($data, true);
        foreach($data['children'] as $child)
        {
            $key      = $child['key'];
            $selected = $child['selected'];
            $title    = $child['title'];

            printf("<p>Key: %s, selected: %s, title: %s\n", $key, $selected ? "true" : "false", $title);

            if (isset($child['children'])) 
            {
                foreach ($child['children'] as $c) 
                {
                    $key      = $c['key'];
                    $selected = $c['selected'];
                    $title    = $c['title'];
                    printf("<p>Key: %s, selected: %s, title: %s\n", $key, $selected ? "true" : "false", $title);

                }
            }

        }
    }

感谢@jeromegamez 的帮助。

于 2015-04-20T20:29:02.363 回答