JSON.parse 不适用于从 AJAX 调用返回的 JSON 字符串

JSON.parse not working with JSON string returned from an AJAX call

本文关键字:JSON 返回 字符串 调用 parse 不适用 适用于 AJAX      更新时间:2023-09-26

我有一段JavaScript,它通过ajax调用从后端获取数据。返回了一个 JSON 字符串,我无法弄清楚为什么 JSON.parse 不起作用。

这是我的代码

var success_get = (jQuery).ajax({
  url: "<?php echo base_path(); ?>reservation/success_get",
  method: "GET",
  async: "true"
});

在Firefox中,我查看控制台,看到返回的JSON success_get是

{"Reservations":[{"Id":"415b68e9-1209-4ca9-9f6b-47116ced1769","ExtraDuration":0,"TotalDuration":1,"CreationTime":"2016-02-08T00:22:59+11:00","ExpiryTime":"2016-02-08T00:32:28+11:00","Sender":{"ReturnOption":"Dispose","ReturnAddress":null,"Id":"044bf5b5-95cd-44d1-a22a-8070b45a26ba","FirstName":"Test","LastName":"User","Email":"web@tz.net","Phone":"85112366"},"Recipient":{"Id":"b53ad6ac-9750-44c8-9bdd-581e89d3be93","FirstName":"Test","LastName":"User","Email":"test@test.com","Phone":"12345678"},"KioskCode":"Hm1","LockerSize":"Small","LockerNumber":"I5","Total":4.5}],"TotalAmount":4.5,"Sender":{"ReturnOption":"Dispose","ReturnAddress":null,"Id":"044bf5b5-95cd-44d1-a22a-8070b45a26ba","FirstName":"Test","LastName":"User","Email":"web@tz.net","Phone":"85112366"},"NumberOfHoursForDropOff":47}

据我所知,这看起来像有效的 JSON

然后我正在执行以下操作

success_get.done(function( success ) {
  object_rsuccess = JSON.parse(success);
  console.log(object_rsuccess);
});

在火狐中,我收到错误

ReferenceError: object_rsuccess is not defined

但是在控制台中.log我看到

Object { Reservations=[1],  TotalAmount=4.5,  Sender={...},  more...}

当我展开大括号中的部分时,我看到了我期望看到的数据。

本以为我可以通过执行以下操作来查看变量,例如 TotalAmount

var totalamount = object_rsuccess.TotalAmount;

但是当我收到未定义object_rsuccess的错误时,这将不起作用。

我错过了什么还是只是犯了一个愚蠢的错误?

将使用该object_rsuccess的代码包装在一个函数中:

var theFunctionToBeCalled = function(obj){
    var totalamount = obj.TotalAmount;
    console.log(totalamount);
};

然后在.done()中调用它:

success_get.done(function(success) {
    var object_rsuccess = JSON.parse(success);
    console.log(object_rsuccess);
    theFunctionToBeCalled(object_rsuccess);
});

您的 AJAX 设置使函数异步,这意味着您的其余代码将继续执行,即使您全局定义object_rsuccess,它也很可能在需要时无法使用。

除了我的建议之外,根据您感觉舒适的内容,您可以将使用object_rsuccess的所有内容都放在.done()中或将async:true更改为async:false