我一直在尝试使用Ajax GET请求加载某些Json,然后对其进行解析。

但是,当尝试从HTML脚本标签访问Json密钥时,它是未定义的。

为了调试此问题,我在控制台中记录了Json的所有键以及Json本身。因此,我利用了这个功能:

function getInv() {
    $.get( "/inventory/", function( data ) {
      var invList = data.split(",, "); // Explanation is below
      console.log(invList[0]) // Just testing with first object
      console.log(Object.keys(invList[0]));
    });
}
getInv();


data.split(“ ,,”)的目的:

由于我的后端脚本使用不同的编程语言,因此我不得不将其解释为适合Javascript的一种。
还有多个Json对象,因此我用",, "分隔了它们,然后在Javascript中拆分它们以创建Json对象列表。

调用函数后,出现以下输出:

javascript - 通过脚本标记使用Json键时未定义-LMLPHP

尽管有趣的部分是在将Json对象粘贴到控制台后,如下所示:

javascript - 通过脚本标记使用Json键时未定义-LMLPHP

这是输出:

javascript - 通过脚本标记使用Json键时未定义-LMLPHP

因此,基本上,在脚本标签中,我无法访问对象的键,尽管一旦在控制台中手动使用它,就可以访问所有键。

这背后的目的是什么?给出不同的输出似乎很奇怪。也许invList[0]在script标签中根本不是Json对象吗?谢谢!

最佳答案

data.split()返回字符串数组,而不是对象。您需要使用JSON.parse()将JSON字符串解析为相应的对象。

function getInv() {
    $.get( "/inventory/", function( data ) {
      var invList = data.split(",, ");
      console.log(invList[0]) // Just testing with first object
      var obj = JSON.parse(invList[0]);
      console.log(Object.keys(obj));
    });
}


您可以使用.map()来解析所有对象,然后将得到一个与您期望的对象数组:

var invList = data.split(",, ").map(JSON.parse);

10-05 21:07
查看更多