【问题标题】:Add function to JSON object with php使用 php 向 JSON 对象添加函数
【发布时间】:2014-05-05 12:34:30
【问题描述】:

有没有办法用php给JSON对象添加函数?

我在 php 中有一个这样的数组:

$aoData = array(
array('name' => 0, 'value' => "id"),
array('name' => 1, 'value' => "title"),
array('name' => 2, 'value' => "cat"),
array('name' => 3, 'value' => "img"),
array('name' => 4, 'value' => "des"));

我想添加一个这样的函数:

array('name' => 5, 'value' => function(){return "hi"})

并在我的 jquery 中使用这个函数。

有什么办法吗?

更新

在数据表中我需要在php中设置aoColumnDefs。

    "aoColumnDefs": 
    [{
        "aTargets": [ img ],
        "mData": "thumb_img",
        "mRender": function ( data, type, full ) 
            return '<img src="../up/thumb/'+data+'">';
            },
        {etc}
        ]

所以我需要将函数设置为 Json 函数或其他方式...

【问题讨论】:

标签: javascript php json datatable


【解决方案1】:

出于安全和兼容性的原因,JSON 不允许函数定义,作为证明,除了存储字符串并使用 eval 形式(即使用 eval 或创建 Function 与身体)。不过我强烈建议不要这样做。

【讨论】:

    【解决方案2】:

    为了使其成为 JSON,并且任何 JSON 库都可以使用它,不,这是不可能的。

    JSON 是一种独立于语言和平台的可移植数据序列化方案,因此可以在其中表示的内容有限。鉴于它们是特定于语言和平台的函数,它们是不可移植的。

    可能使用 PHP 来“手动”输出具有方法的 JavaScript 对象:

    <?php
        $foo = '{name: 5, value: function () { return "hi";}}'
    ?>
    var js_object = <? echo $foo; ?>;
    

    然而,这很混乱且容易出错,而且不会是 JSON。

    【讨论】:

    • 我想用 php 设置我的 mRender 参数 ,"aoColumnDefs": [ { "aTargets": [ 0 ], "mData": "id", "mRender": function ( data, type, full ) { return '"; } } ],
    • 您需要坚持只使用 PHP 传送数据,并将其注入到 JavaScript 的代码/逻辑中。
    • @Oveys :如果您需要 DataTables 的特定解决方案,请完成您的问题。
    【解决方案3】:

    所以是的... JS Object 与 JSON 不同。

    一些库或框架会想要向 JS 对象添加函数。

    例如,primevue 有一个菜单结构,其中包含 Object 中的功能:

    const items = {
            label: 'New',
            icon: 'pi pi-plus',
            command: (event) => {
                // event.originalEvent: Browser event
                // event.item: Menuitem instance
            }
        }
    ;
    

    很好,但是如果您希望通过 php 从 DB 提供这些数据...?

    这行得通:

    const func = 'items.command = function(event){ console.log(event) }'
    eval(func)
    

    所以我们可以用这个做点什么。 这意味着在将 JSON 加载到 Javascript 中时对其进行处理,并使用 eval 将一些字符串转换为函数。 这当然是一个安全风险。 但不知何故,我们需要将 JSON 更改为 JS 对象。

    更好的可能是数据库中没有最终平台的信息。 我使用的解决方案是,我预先定义了哪些命令可以添加到 JS 对象中,并使用代码告诉读者我要添加什么。

    switch (add) {
        case '[login]':
            items.command: () => {
                auth.destroyToken()
                this.$router.push({ name: 'login' })
            }
        break;
    }
    

    不像“免费”,但为了安全,这是一件好事。

    【讨论】:

      【解决方案4】:

      不能将函数添加为值,但可以将函数的返回值添加为json对象的值。 所以在你给出的例子中,这个值就是“hi”(如果你输入正确的话)。

      我看不出将函数添加到 JSON 对象中的原因,因为您可以对 JQuery 做同样的事情,如果不能使用 AJAX 从服务器端获取结果。

      【讨论】:

        猜你喜欢
        • 2013-06-01
        • 2021-01-02
        • 2012-11-13
        • 2016-04-10
        • 2012-08-21
        • 2013-02-12
        • 2013-09-05
        • 2012-06-06
        • 1970-01-01
        相关资源
        最近更新 更多