繁体   English   中英

当响应为字典格式时,如何解析JSON?

[英]How to parse JSON when response is in dictionary format?

我从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格式的响应,是否可以帮助我打印响应文本和存储/打印响应名称,我将不胜感激。

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

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

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

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

要在循环中获取每个迭代的对象,您必须仅将[ ]与索引值一起使用. 这不是必需的。

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

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

这是一个工作版本:

<!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

希望能帮助到你 :-)

根据您的要求,您必须将名称存储在数组中。 将您的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);
}

试试这个简单的方法:

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); 

在循环中使用:

var arrayObj = [];

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

console.log(arrayObj);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM