将字符串转换为Javascript对象以在jqTree中使用

时间:2014-09-05 16:43:16

标签: javascript jquery asp.net ajax jqtree

我正在尝试使用jqTree渲染可折叠树,以便使用AJAX通过ASP.NET项目显示MySQL数据库中的数据。

问题:

我可以从我的AJAX调用中成功获取包含jqTree格式化数据的字符串(即 JSON,即使他们说它支持它)。但是,一旦我得到它,它就会呈现为一个垂直的字符串。如果我对数据进行类型调用,它会说它是一个字符串,即使它在通过console.log进行目视检查时看起来像一个对象。

我尝试了许多不同的方法将字符串放入对象中,结果各不相同。

我在后面的代码中使用它来返回制造的字符串:

return sb.ToString();

结果字符串如下所示(注意没有包装引号):

[{label: 'PCBID: 350',children:[{label: 'TimeStamp: 04-Sep-14 10:30:23'},{label: 'User:     DAVEG'},{label: 'PCBID: 350'},{label: 'Assembly Drawing: 41411'},{label: 'PCB Drawing: 10348'},{label: 'Vendor: SBE'},{label: 'PO Number: 98019'}]},{label: 'Serial Number: Not Assigned'},{label: 'Assembly Drawing: 41411'},{label: 'Last Test Result: None Found'}]

在我的div中会像这样呈现:

[
{
l
a
b
e
l
:

'
P
C
B
I
D
...and so on...

我知道这些是由jqTree呈现的,因为我可以拖动&放下它们,点击它们时会突出显示等等,但不是树形视图,而是一个“悬挂的藤蔓”视图,并不完全有用。

如果我只是采用相同的完全相同的字符串并在JS中将其声明为var(不使用message.d的返回值):

var data = [{label: 'PCBID: 350',children:[{label: 'TimeStamp: 04-Sep-14 10:30:23'},{label: 'User: DAVEG'},{label: 'PCBID: 350'},{label: 'Assembly Drawing: 41411'},{label: 'PCB Drawing: 10348'},{label: 'Vendor: SBE'},{label: 'PO Number: 98019'}]},{label: 'Serial Number: Not Assigned'},{label: 'Assembly Drawing: 41411'},{label: 'Last Test Result: None Found'}] 

在我的JS代码和&使用它,它显示完美,typeof认为它是一个对象。

工作示例,以便您可以看到我在寻找的内容:

JSFiddle

JS方面的代码:

这是我的AJAX调用的Success部分,其中有一些注释掉的版本也不起作用:

    success: function (message)
    {
        console.log("SUCCESS:  Inside processEvent AJAX success call");
        console.log(message.d);
        console.log(typeof message);
        console.log(typeof message.d);
        var data = message.d;
        //this method works, but not very useful as it's hard coded:
        //var data = [{ label: 'PCBID: 350', children: [{ label: 'TimeStamp: 04-Sep-14 10:30:23' }, { label: 'User: DAVEG' }, { label: 'PCBID: 350' }, { label: 'Assembly Drawing: 41411' }, { label: 'PCB Drawing: 10348' }, { label: 'Vendor: SBE' }, { label: 'PO Number: 98019' }] }, { label: 'Serial Number: Not Assigned' }, { label: 'Assembly Drawing: 41411' }, { label: 'Last Test Result: None Found' }];
        var data = $.getJSON(message.d);
        //var data = { JSON.parse(message.d) };
        //var data = ({}).valueOf.call($.parseJSON(message.d));
        //var data = object.create(message.d);
        console.log(typeof data);
        console.log(data);
        $(function ()
        {
            $('#tree1').tree({
                data: data,
                autoOpen: false,
                saveState: true,
                dragAndDrop: true
            });
        });

问题:

毕竟,我的问题是,如何从AJAX message.d中取出字符串并将其转换为对象,以便jqTree可以使用它来呈现我正在寻找的树?

工作代码:

我已经添加了一些成功的用户通知内容(jGrowl),所以不要让它扔给你。修复它的代码位于:data = eval($.parseJSON(message.d));

    success: function (message)
    {
        console.log("SUCCESS:  Inside processEvent AJAX success call");
        console.log(message.d);
        //if it's a non query event, do this
        if (DTO.eventData.eventType != "PCBID_query")
        {
            $.jGrowl("\nSuccessfully inserted a " + DTO.eventData.eventType + " event into the MySQL database.",
                { header: 'SUCCESS', theme: "pcb-success", life: 10000 });
        }
        //if processData was used for a PCBID query, process this code
        if (DTO.eventData.eventType === "PCBID_query")
        {
            var data = {};
            data = eval($.parseJSON(message.d));
            $(function ()
            {
                //force reload of tree data
                $('#tree1').tree('loadData', data);
                $('#tree1').tree({
                    data: data,
                    autoOpen: false,
                    saveState: true,
                    dragAndDrop: true
                });
            });
        }

我知道eval是邪恶的&提出了一个安全漏洞,但这是所有内部代码,只能在本地服务器上使用。生产地板计算机所以我认为风险是可以接受的(我的经理也是如此)。

1 个答案:

答案 0 :(得分:1)

在这种情况下,

eval(data)会起作用,但使用eval()通常是一个安全问题,尤其是从公共区域获取数据时,例如用户提交的SQL数据。

最好的解决方案是寻找从ASP.NET导出JSON的真正方法。在不知道你的代码的情况下,一些谷歌搜索显示有解决方案。