如何将JSON响应从公共API转换为JSON对象?

时间:2019-03-27 23:33:14

标签: javascript api xmlhttprequest

我正在尝试从OpenWeatherMap API中获取一些数据。当我发送带有所需API密钥和位置数据的请求时,一切返回正常。返回的数据似乎是JSON格式。但是,当我在字符串上执行JSON.parse()函数时,会出现“输入意外结束”错误。

我发现有趣的一件事是,如果我将字符串存储到变量中,然后继续在Chrome的调试控制台中执行该函数,那么它会很好地完成。

let jsonData;
let jsonActual;
function GetWeather(city, country){
  Http = new XMLHttpRequest();
  Http.open("GET", weatherUrl + city + "," + country + weatherKey);
  Http.send();
  Http.onreadystatechange=(e)=>{
    jsonData = Http.response;
    jsonActual = JSON.parse(jsonData.toString());

  }
}

在使用控制台时:

x = JSON.parse(jsonData) // Completes successfully

2 个答案:

答案 0 :(得分:1)

在您的职能onreadystatechange中,您拥有

Http.onreadystatechange=(e)=>{
    jsonData = Http.response;
    jsonActual = JSON.parse(jsonData.toString());

  }

尝试改为执行此操作:

Http.onreadystatechange=(e)=>{
    if (this.readyState === 4) {
         jsonData = Http.response;
         jsonActual = JSON.parse(jsonData.toString());
    }

  }

答案 1 :(得分:0)

您的root@7bfa781e1a2c:/opt/hive/conf# ps aux | grep mysql mysql 1931 0.0 0.0 4624 1768 ? S 20:19 0:00 /bin/sh /usr/bin/mysqld_safe mysql 2282 0.2 8.7 1416908 179700 ? Sl 20:19 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag= root 2594 0.0 0.0 11460 1084 pts/1 S+ 20:24 0:00 grep --color=auto mysql root@7bfa781e1a2c:/opt/hive/conf# 是否readyState从未被检查:

complete

您还可以检查Http.onreadystatechange = e => { if (this.readyState == "complete") { jsonData = Http.response; jsonActual = JSON.parse(jsonData.toString()); } }

4

您甚至可以使其更简单并使用Http.onreadystatechange = e => { if (this.readyState == 4) { jsonData = Http.response; jsonActual = JSON.parse(jsonData.toString()); } }

fetch