无法解析包含转义字符的JSON对象

时间:2019-05-11 09:09:09

标签: javascript json

我是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一样完美地工作,而只需调用一次即可。
谢谢大家这么快回答!似乎每个人都立即意识到我的问题。

4 个答案:

答案 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();
        }