【问题标题】:Chrome detects unexptected token ":" even though it isn't thereChrome 检测到意外的令牌“:”,即使它不存在
【发布时间】:2018-04-20 09:35:44
【问题描述】:

我尝试使用此 jQuery 代码从 google distancematrix API 获取 JSON 数据:

<script type="text/javascript">
    $(document).ready(function(){
        url = "https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=Washington,DC&destinations=New+York+City,NY&key=AIzaSyC1YPi3w46cOyrkUa8s0vR9QHzeoQCoum4";
        $.ajax({
          type: "GET",
          url: url,
          dataType: "json",
          jsonpCallback: "results"
        })

        function results(data) {
            console.log("data" + data);
        } 
    });
</script>

如果我查看浏览器 (Google Chrome) 的控制台,我会收到以下错误消息:

Uncaught SyntaxError: Unexpected token :

如果我点击那个 JSON 文件,我会得到“Nothing to preview”。

编辑:

我在我的网络标签中看到了这个回复:

奇怪的是,正确的 JSON 响应被发送到我的浏览器:

【问题讨论】:

  • 请您使用console.log("data:", data); 看看它记录了什么?警报可能只显示 [object Object]
  • 您确定这不是触发错误的响应吗?您确定要发回格式正确的 JSON 吗?您的网络选项卡中的响应是什么样的,它会触发吗?
  • 您收到了JSON 响应,因为端点没有返回JSONP。在您的 URL 中,端点也在查询参数之前指定为 json。我怀疑您是否可以使用 JSONP 来实现它(Google 不会返回它)

标签: javascript jquery json google-chrome


【解决方案1】:

我认为您最终仍会遇到 CORS 问题。我建议使用 Google API 的文档以不同的方式处理它。它相当简单,为您提供更多选择并且效果更好:

(function($){

function init(){
var origin = 'Greenwich, England';
var destination = 'Stockholm, Sweden';

var service = new google.maps.DistanceMatrixService();
service.getDistanceMatrix(
  {
    origins: [origin],
    destinations: [destination],
    travelMode: 'DRIVING'
  }, callback);

function callback(response, status) {
  // See Parsing the Results for
  // the basics of a callback function.
	
	console.log(response);
}
};
	
$(window).ready(function(){
	init();
});
})(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=yourkey">
</script>

小提琴working fiddle without key

编辑

Google 的回复将在JSONXML 中。要获得JSONP 响应,Google 需要为您的端点支持该响应,但它不支持。拥有 API 密钥似乎无法解决 CORS 问题,这意味着对 JSON 数据的请求将导致“没有访问控制标头存在”错误。

From Docs: “这些网络服务使用对特定 URL 的 HTTP 请求,将 URL 参数作为参数传递给服务。通常,这些服务在 HTTP 请求中以 JSON 或 XML 的形式返回数据以进行解析和/或处理由您的应用程序。”

Google Maps API Docs

【讨论】:

  • 这个练习是讲课的,禁止使用谷歌图书馆处理JSON数据(我不明白为什么,但就是这样)。
  • Google 不会随意使用 jsonp 响应 json 请求(请参阅端点:maps.googleapis.com/maps/api/distancematrix/json)。您可以尝试强制该响应,并且您会得到响应(200),但您无能为力。这里有各种解决方案,但您的方法总是会遇到 CORS。我讨厌毫无意义的讲座练习。
【解决方案2】:

这是一个偷偷摸摸的,它确实让我猜到了一些:

//Change this:
dataType: "jsonp",
// to this:
dataType: "json",

可能是相关的如何我找到了它,所以你下次可以做(我在控制台中做了所有这些,但在脚本/文件中也可以):

  • 首先我只是输入了网址 -> 没有错误,所以没有奇怪的网址或其他时髦的东西
  • 然后只是 results 函数 -> 仍然没有错误。现在我们知道它在 ajax 调用中了。
  • 将 ajax 函数输入到我的编辑器中,如下所示:
    • 首先是 -> 我得到了错误
    • 现在只是带有 TYPE 和 URL 的 AJAX 函数 -> 没有错误
    • 重新添加了 dataType -> 错误。
    • 删除数据类型并添加回调 -> 没有错误
    • 现在我们知道它必须是 dataType 行
  • 将那句话复制到我的编辑器并将字体放大到大
    • 所有字符看起来都很好,没有时髦的引号。
    • 手动重新输入整行(没有复制/过去)并尝试 -> 错误
    • 现在我们知道它要么是错误的键,要么是不正确的值
  • 打开文档,看看如何拼写(大写 T,确定吗?)-> 正确
  • 打开文档,查看正确的值 -> 等等,没有 JSONP
  • 更改代码,“jsonp”->“json”->工作代码!

跨域“json”请求转换为“jsonp”

所以 jquery 在内部为你做这件事。

【讨论】:

  • 请给我完整的 html 代码好吗?我编辑了我的问题,也许这些附加信息对你有帮助。
  • 我使用了你的 js,只是将它复制到我的控制台。我改变的只是P,就是这样。然后我得到了回复,上面写着“无效令牌”
  • 然后你得到和我一样的错误。看起来谷歌浏览器不知道如何解释 json 数据并将: 检测为无效令牌。你知道如何解决这个问题吗?
  • 我怀疑数据不正确,如果是这样的话,所有的恐慌都会消失。如果这不能解决它,我不知道。对我有用
  • 您刚刚说您收到了错误invalid token,那么如果您收到错误,如何为您解决?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多