我是javascript新手,只是学习AJAX调用和解析JSON对象,所以我知道我只是缺少一些明显的东西。我可以从API检索JSON字符串,但无法正确解析。 我不确定是否要发送无法解析的JSON对象,或者只是尝试以错误的方式读取字段。 感谢您抽出宝贵的时间阅读本文,非常感谢您的帮助,我不知所措。
我可以通过this.responseText获取JSON字符串,但是当我尝试访问“标题”字段时,我只会感到困惑。我正在尝试以这种方式访问它: this.responseText.title 我也尝试过: this.responseText [title]和this.responseText [“ title”]
"{\"Id\":220,\"Title\":\"Drawtober 19\",\"YearCreated\":0,\"DatePublished\":\"2018-12-14T03:27:05.51\"}"
是我从AJAX调用中得到的,也是我尝试获得标题的尝试:
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
let x = this.responseText;
let firstTest = JSON.parse(x[0]);
let secondTest = JSON.parse(x.Title);
}
};
xhttp.open("GET", "http://www.faithfulimagination.com/api/artwork/220", true);
xhttp.send();
}
我希望看到“ Drawtober 19”,而我得到的只是“未定义”
编辑
正如Barmar指出的那样,问题最初出在我的API中。我正在调用JsonConvert.SerializeObject并返回一个字符串,而不是仅返回该对象。
两次调用JSON.parse(x)都可以像修复我的API一样完美地工作,而只需调用一次即可。
谢谢大家这么快回答!似乎每个人都立即意识到我的问题。
答案 0 :(得分:4)
您的响应被编码两次,因此您需要对其解码两次:
let data = JSON.parse(JSON.parse(x));
let title = data.Title;
没有充分理由进行双重编码。如果faithfulimagination.com是您的网站,则应该对其进行修复。
答案 1 :(得分:0)
只需使用JSON.parse(x)
来解析整个对象:
const x = "{\"Id\":220,\"Title\":\"Drawtober 19\",\"YearCreated\":0,\"DatePublished\":\"2018-12-14T03:27:05.51\"}";
const res = JSON.parse(x);
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }
答案 2 :(得分:0)
您需要使用JSON.parse(this.responseText)
将响应字符串解析为一个对象。您的属性将在该方法返回的对象上。
JSON.parse(this.responseText).Title
答案 3 :(得分:0)
xhr请求仅返回json字符串。使用前,您必须将其解析为javascript对象。
但是let firstTest = JSON.parse(x[0]);
仅返回无效,因为对象x
不是数组
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
let x = JSON.parse(this.responseText);
//let firstTest = JSON.parse(x[0]); Invalid because x is not an array
let secondTest = JSON.parse(x.Title);
}
};
xhttp.open("GET", "http://www.faithfulimagination.com/api/artwork/220", true);
xhttp.send();
}