【问题标题】:Iterate over JSON object with children用孩子迭代 JSON 对象
【发布时间】:2015-04-21 04:56:56
【问题描述】:

我正在使用 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...

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

任何帮助将不胜感激。

【问题讨论】:

  • 这个问题的信息有点少。能分享一下你尝试过的,遇到了什么问题吗?
  • 对不起,我现在添加了更多细节。

标签: php json laravel-5 fancytree


【解决方案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);
    }
}

【讨论】:

  • 我收到 ErrorException: Illegal string offset 'children'
  • 我认为这与您原始帖子中存在的 JSON 有关,因为它是无效的。例如,在倒数第二行中,您有一个尾随逗号,这在 JSON 中是无效的。 (请将您帖子中的 JSON 与我回答中的 JSON 进行比较)
  • 逗号是我的错误。您的代码在其他地方运行良好。但是,它在这里不起作用。知道“非法字符串偏移”错误是什么意思吗?
  • 在以“Milk”结尾的行(倒数第三行)中还有一个逗号,请您删除它并检查它是否有效?
  • 额外的逗号是我在尝试复制粘贴时的错误。我添加了完整的 var_dump。请检查并查看我在哪里犯了错误。
【解决方案2】:

我需要从 $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 的帮助。

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 2017-07-05
    • 2019-05-12
    • 2017-10-25
    • 2017-07-26
    • 2017-05-21
    • 2011-06-05
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多