使用Javascript从JSON抓取数据

时间:2009-05-07 15:39:03

标签: javascript jquery json

好的,我有一个json输出,如下所示:

{"Result" : [
              {
                "Id" : "5214",
                "ParentReasonId" : "0",
                "Description" : "Billing & Payment",
                "SysName" : "Billing & Payment",
                "SysCategory" : "Billing & Payment",
                "ClientId" : "924",
                "DispositionCount" : "6",
                "IsActive" : true,
                "ChildReasonCount" : "8",
                "Attributes" : [],
                "SortOrder" : "0",
                "CreatedBy" : null
              }
            ]
 }

我想从中提取id和description的数据。

    jQuery("#chained_child").cascade("#chained", {
    ajax: { url: 'Customhandler.ashx?List=MyList' },
        template: commonTemplate,
        match: commonMatch
    });

function commonTemplate(item) {
    return "<option Value='" + item.Result.Id + "'>" 
           + item.Result.Description + "</option>";
};

但是对于我的生活,我无法让它回归我正在寻找的价值。我知道这是一些蠢货,但我正在撞墙。有人可以帮忙吗?

6 个答案:

答案 0 :(得分:6)

如果检查JSON字符串,则Result对象实际上是一个大小为1的数组,其中包含一个对象,而不仅仅是一个对象。您应该删除额外的括号或使用以下内容引用您的变量:

item.Result[0].Id

为了使用item.Result.Id引用您的变量,您需要以下JSON字符串:

{
    "Result" :
    {
        "Id" : "5214",
        "ParentReasonId" : "0",
        "Description" : "Billing & Payment",
        "SysName" : "Billing & Payment",
        "SysCategory" : "Billing & Payment",
        "ClientId" : "924",
        "DispositionCount" : "6",
        "IsActive" : true,
        "ChildReasonCount" : "8",
        "Attributes" : [],
        "SortOrder" : "0",
        "CreatedBy" : null
    }
}

答案 1 :(得分:1)

使用JSON funkyness极大地帮助我的一件事是在Firebug中设置断点,让你逐步完成结果对象,并查看其结构。

答案 2 :(得分:1)

item.Result [0] .Id就像Sebastian所说的那样 - 但是只有在“item”实际分配了一个值时它才有效。我的猜测是不是。

在你的commonTemplate函数中尝试执行console.log(item)并查看结果是什么。

答案 3 :(得分:1)

就我在plugin page上看到的那样,发送给模板回调的参数是一个 来自JSON响应的 item ,它是一个Array。您的JSON响应是一个对象。我猜你没有发送正确的JSON响应。但是,由于我从未使用过这个插件,所以要花一点时间。

无论如何,如果我是对的,你的反应应该是:

[
    {
        "Result" :
        {
            "Id" : "5214",
            "ParentReasonId" : "0",
            "Description" : "Billing & Payment",
            "SysName" : "Billing & Payment",
            "SysCategory" : "Billing & Payment",
            "ClientId" : "924",
            "DispositionCount" : "6",
            "IsActive" : true,
            "ChildReasonCount" : "8",
            "Attributes" : [],
            "SortOrder" : "0",
            "CreatedBy" : null
        }
    }
]

答案 4 :(得分:1)

Ionut G. Stan的回答是正确的。您的json输出不是cascade插件的正确格式。

如果您不想更改json,可以使用dataFilter设置中的ajax选项来增加数据。

我在这里设置了一个有效的演示:http://jsbin.com/ebohe(可通过http://jsbin.com/ebohe/edit进行编辑)

以下是相关的javascript:

$(function(){
  $('#chained_child').cascade(
    '#chained',
    {
      ajax: {
        url: 'Customhandler.ashx?List=MyList',
        dataFilter: extractResult
      },
      template: customTemplate,
      match: customMatch
    }
  );

  function extractResult(data) {
    return eval('(' + data + ')').Result;
  }

  function customTemplate(item) {
    return $('<option />')
      .val(item.Id)
      .text(item.Description);
  }

  function customMatch(selectedValue) {
    return this.ParentReasonId == selectedValue;
  }
});

答案 5 :(得分:0)

您可能需要查看IBM的这个JSON教程:

Mastering Ajax, Part 10: Using JSON for data transfer