JQuery AJAX responseText到JSON

时间:2010-04-23 22:00:18

标签: jquery

我有这个调用.net WebService的脚本

msg = $.toJSON(
        $.ajax({
            type: "POST",
            url: "http://[url]/ETS.UI/WebServices/LocationService.asmx/GetMappingLocationDetails",
            contentType: "application/json; charset=utf-8",
            data: $.toJSON({'componentId':994}),
            dataType: "json",
            async: false
        }).responseText
);

我在msg变量中收到以下值:

""{\"d\":\"{\\\"ComponentId\\\":994,\\\"Latitude\\\":32.219627009236405,\\\"Longitude\\\":-110.96843719482422,\\\"LocationName\\\":\\\"Tucson\\\",\\\"StreetAddress\\\":\\\"7201 E 22nd Street \\\",\\\"City\\\":\\\"Tucson\\\",\\\"State\\\":\\\"AZ\\\",\\\"PostalCode\\\":null}\"}""

我不知道为什么会这样格式化,似乎只在responseText中执行此操作。

有没有人有任何想法?

2 个答案:

答案 0 :(得分:2)

正如SLaks所提到的,同步AJAX是一个非常糟糕的想法®。如果您要在地图上循环绘制项目,则无论如何都不想为每个项目调用服务器 - 由于所有项目的累积延迟,您将获得绝对可怕的性能而不仅仅是几个项目往返。

更好的方法是向服务器提交componentId数组。 服务器然后可以遍历ID数组并返回一个lat / longs数组以及其他任何你在地图上绘制的内容。

    $.ajax({ 
        type: "POST", 
        url: "http://[url]/ETS.UI/WebServices/LocationService.asmx/GetMappingLocationDetails", 
        contentType: "application/json; charset=utf-8", 
        data: $.toJSON([{'componentId':994},{'componentId':995}, ... ]), 
        dataType: "json", 
        async: true,
        success: callbackFunctionThatPlotsReturnedPoints
    });

您可能还想查看this plugin,这样可以更轻松地从jQuery调用ASMX服务。

答案 1 :(得分:0)

直接回答你的问题 - 你要解析json两次 - 一次是因为你指定了dataType:'json',再次使用$ .toJSON。您可以将数据类型更改为“text”,它将解决您的问题。

但是,正确的答案是使用带回调的异步调用。其他人已经回答了我正在打字的问题,所以请看看他们的答案:)

<强> - 编辑 -

回答你的意见(因为格式化在评论中不起作用)。您不需要对数据进行字符串化 - 您可以将其作为对象发送。在函数之前不需要声明msg变量。 Async是默认设置,因此您可以将其保留。

var list = [994, 994, 994, 994]; 
$.ajax({ 
  type: "POST", 
  url: "http://www.eaglerider.com/ETS.UI/WebServices/LocationService.asmx/GetMappingLocationDetails", 
  contentType: "application/json; charset=utf-8", 
  data: { componentIdCollection: list },
  dataType: "json", 
  sucess: function(msg){
    // msg holds your JSON data
    console.log(msg); 
  }
});

一旦你获得了msg数据,我猜你想将它附加到列表中,然后你会调用在地图上重绘位置数据的函数。