响应是否为字典格式时如何解析JSON?

时间:2016-11-03 02:16:02

标签: javascript json api

我从API调用获得如下的HTTP响应。我只需要将名称存储在一个数组中。

{
  "results":[
             {"name":"First","venue":{"zip":"90405","country":"US"},"desc":"1D"},
             {"name":"Second","venue":{"zip":"89065","country":"US"},"desc":"2D"},
             {"name":"Third","venue":{"zip":"92352","country":"US"},"desc":"3D"}
            ],
  "meta":{"next":"xxxx","url":"yyyy"}
}

我写了下面的代码,不知道出了什么问题。请帮忙。

<!DOCTYPE html>
<html>
<body>
<div id="id01"></div>
<div id="id02"></div>

<script>
var xmlhttp = new XMLHttpRequest();
var url = ".....";

xmlhttp.onreadystatechange = function() 
{
    if (this.readyState == 4 && this.status == 200) 
    {
        document.getElementById("id01").innerHTML = this.responseText; 
        // here its not printing the responseText as expected.?????
        var myArr = JSON.parse(this.responseText);
        myFunction(myArr);
    }
};
xmlhttp.open("GET", url, true);
xmlhttp.send();
console.log(xmlhttp.status);
console.log(xmlhttp.statusText);

function myFunction(arr) 
{
    var out = "";
    var i;
    for(i = 0; i < arr.length; i++) 
    {
        out += arr["results"].[i].name; // ????
    }
    document.getElementById("id01").innerHTML = out;
    document.write(out);
}
</script>

</body>
</html>

所以我在两行中遇到问题,如代码中的问号所示,并且明白我正在犯大错。我是网络技术的初学者,如果有任何人可以帮助我如何打印响应文本和存储/打印名称来自http响应,如果是那种格式,我将不胜感激。

4 个答案:

答案 0 :(得分:0)

您的JSON响应是Object,有两个属性,第一个是results,它是对象数组,第二个是meta,它是对象。

现在您正在尝试循环对象数组,因此for循环中的条件必须更改为

for(i = 0; i < arr.results.length; i++)

这里我们检查Objects results属性的长度,该属性是对象数组。

要获取循环中的每个迭代对象,您必须使用带有索引值的[ ] ..现在您还需要一个额外的.

out += arr["results"][i].name;

arr["results"]将指向数组,[i]将访问给定索引中的对象(i的值)

答案 1 :(得分:0)

这是一个有效的版本:

<!DOCTYPE html>
<html>
<body>

<div id="id01"></div>
<div id="id02"></div>

<script>
var responsetext = "{ \"results\":[ {\"name\":\"First\",\"venue\":{\"zip\":\"90405\",\"country\":\"US\"},\"desc\":\"1D\"}, {\"name\":\"Second\",\"venue\":{\"zip\":\"89065\",\"country\":\"US\"},\"desc\":\"2D\"}, {\"name\":\"Third\",\"venue\":{\"zip\":\"92352\",\"country\":\"US\"},\"desc\":\"3D\"} ], \"meta\":{\"next\":\"xxxx\",\"url\":\"yyyy\"}}";

var myArr = JSON.parse(responsetext);
myFunction(myArr);

function myFunction(arr) 
{
    var out = "";
    var i;
    for(i = 0; i < arr.results.length; i++) 
    {
        out += arr.results[i].name;
    }
    document.getElementById("id01").innerHTML = out;
    document.write(out);
}
</script>

</body>
</html>

您需要引用arr.results.length(因为数组位于对象的结果键中),而且它是arr["results"][i].name,或者(更好)arr.results[i].name

希望它有所帮助: - )

答案 2 :(得分:0)

根据您的要求,您必须将名称存储在数组中。 将您的http响应存储在变量myArr中。

myFunction(myArr); //Out put in console ["First", "Second", "Third"]

function myFunction(arr) 
           {
               var resultarr = arr.results;
               var out = [];
               for(var i = 0; i < resultarr.length; i++) {
                   var obj = resultarr[i];
                   out.push(obj.name);
          }
          document.getElementById("id01").innerHTML = out;
         document.write(out);
}

答案 3 :(得分:0)

尝试这种简单方法:

JSON:

var Obj = {
  "results":[
             {"name":"First","venue":{"zip":"90405","country":"US"},"desc":"1D"},
             {"name":"Second","venue":{"zip":"89065","country":"US"},"desc":"2D"},
             {"name":"Third","venue":{"zip":"92352","country":"US"},"desc":"3D"}
            ],
  "meta":{"next":"xxxx","url":"yyyy"}
};

使用数组映射方法:

var result = Obj.results.map(function(a) {return a.name;});

console.log(result); 

使用for in循环:

var arrayObj = [];

for (var i in Obj.results) {
  arrayObj.push(Obj.results[i].name);
}

console.log(arrayObj);

输出 ["First", "Second", "Third"]