JavaScript JSON解析返回undefined

时间:2017-07-10 06:38:01

标签: javascript json undefined

我有以下功能

function getSetting(item) {
    var rawFile = new XMLHttpRequest();
    rawFile.overrideMimeType("application/json");
    rawFile.open("GET", "settings.json", true);
    rawFile.onreadystatechange = function() {
        if (rawFile.readyState === 4 && rawFile.status == "200") {
            var data = JSON.parse(rawFile.responseText);
            return data.item;
        }
    }
    rawFile.send(null);
}

我正在测试这个

console.log(getSetting('restaurant_name'));

返回未定义

一个数据的console.log按预期返回我的JSON文件的JSON对象。

item 的console.log按预期返回 restaurant_name

我一定错过了一些明显的东西,但是看过与此相关的Stackoverflow上的其他主题我还没有遇到任何问题。

我尝试使用 data [0] .item 来获得结果,但也没有区别。

settings.json文件的内容:

{
  "restaurant_name": "Example_Restaurant_Name",
  "restaurant_address": "Example Restaurant, England"
}

提前帮助,谢谢。

2 个答案:

答案 0 :(得分:2)

  1. 您正在使用不正确的对象查找形式,因为您的代码正在JSON上寻找item名称。
  2. 您的函数无法直接从异步请求返回。
  3. 请改为尝试:

    function getSetting(item, callback) {
        var rawFile = new XMLHttpRequest();
        rawFile.overrideMimeType("application/json");
        rawFile.open("GET", "settings.json", true);
        rawFile.onreadystatechange = function() {
            if (rawFile.readyState === 4 && rawFile.status == "200") {
                var data = JSON.parse(rawFile.responseText);
                callback(data[item]);  // <----- THIS LINE CHANGES
            }
        }
        rawFile.send(null);
    }
    
    getSetting('restaurant_name', function (value) { console.log(value); });
    

答案 1 :(得分:0)

我认为问题出在返回声明中。

return data.item

当你想要的是使用item变量中存储的密钥返回数据对象中的值时,这将尝试在数据对象中为键“&#39;”返回一个值。

我认为你想要的正确语法是:

return data[item]

我也不认为您可以在此处返回函数中的值 - 因此您需要在异步请求返回值后定义回调函数,或者设置一个变量&# 39; s范围在函数之外。

其他人刚刚发布了一个使用回调函数的答案,所以我建议使用这种方法。