Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JSON属性不可访问-“;无法读取未定义的属性";_Javascript_Json - Fatal编程技术网

Javascript JSON属性不可访问-“;无法读取未定义的属性";

Javascript JSON属性不可访问-“;无法读取未定义的属性";,javascript,json,Javascript,Json,我试图使用WikipediaAPI检索文章标题和文章文本片段。但当我试图访问这些属性时,我得到了错误“无法读取未定义的属性” 以下是我的JSON响应: { "batchcomplete": "", "continue": { "gsroffset": 10, "continue": "gsroffset||" }, "query": { "pages": { "13834": {

我试图使用WikipediaAPI检索文章标题和文章文本片段。但当我试图访问这些属性时,我得到了错误“无法读取未定义的属性”

以下是我的JSON响应:

{
    "batchcomplete": "",
    "continue": {
        "gsroffset": 10,
        "continue": "gsroffset||"
    },
    "query": {
        "pages": {
            "13834": {
                "pageid": 13834,
                "ns": 0,
                "title": "\"Hello, World!\" program",
                "index": 6,
                "extract": "<p>A <b>\"Hello, World!\" program</b> is a computer program that outputs or displays \"Hello, World!\" to a user. Being a very simple program in most programming languages, it is often used to illustrate the</p>..."
            },
            "6710844": {
                "pageid": 6710844,
                "ns": 0,
                "title": "Hello",
                "index": 1,
                "extract": "<p><i><b>Hello</b></i> is a salutation or greeting in the English language. It is first attested in writing from 1826.</p>..."
            },
            "1122016": {
                "pageid": 1122016,
                "ns": 0,
                "title": "Hello! (magazine)",
                "index": 7,
                "extract": "<p><i><b>Hello</b></i> (stylised as <i><b>HELLO!</b></i>) is a weekly magazine specialising in celebrity news and human-interest stories, published in the United Kingdom since 1988. It is the United Kingdom</p>..."
            }
        }
    }
}
但这会返回我上面写的错误(“无法读取未定义的属性”):


如果您对如何访问“标题”和“摘录”属性有任何建议,我们将不胜感激。谢谢。

那是因为页面不是数组;它是一个对象,其中键是ID。所以你需要做:

console.log(response.query.pages[1122016].title);
这会奏效的。例如,如果您想要“第一”页,那么

let pages = response.query.pages;
console.log(pages[Object.keys(pages)[0]].title);
注意,我不确定JS对象中键的顺序是否得到保证

如果您想在页面上迭代,请执行以下操作

let pages = response.query.pages;
Object.keys(pages).forEach(id => {
    let page = pages[id];
    console.log(page.title, page.foo);
});

我不确定您使用哪种语言来解析JSON(看起来像console.log中的Javascript?),但问题是query.pages是一个字典,而不是一个数组,因此它不能通过索引进行迭代,只能通过键进行迭代

所以您需要(伪代码):

特殊情况:处理异步调用 各位开发人员好

如果您签出此线程是因为您使用的是React之类的框架,或者其他一些让您使用开发服务器的框架(例如使用
npm start
或类似的工具),那么当您尝试执行
console.log(response.foo.bar)之类的操作时,您的开发服务器可能会崩溃
在数据重新加载时刷新之前

具体地说,我的开发服务器由于未定义的类型消息的
无法读取属性“bar”而崩溃,我想,“这到底是怎么回事!?”。解决方案:将婴儿放在试抓块中:

try { 
    console.log(rate['bar'].rate)
  } catch (error) {
    console.log(error)
  }
为什么??如果您的应用程序具有默认状态(例如,即使是空数组),则它会在从远程源接收数据之前尝试
console.log
记录响应,它将成功记录您的空状态,但是,如果您试图在
控制台.log
或其他任何地方引用希望从远程源接收的对象部分,dev服务器将尝试引用初始加载时不存在的内容,并在通过API或其他方式实际从远程源接收时有机会引用之前崩溃


希望这对别人有帮助

要获取它们的数组:
Object.keys(pages).map(id=>pages[id])
“请注意,我确信JS对象中的键的顺序是有保证的。”不适用于
Object.keys
for in
,不适用。它适用于
Object.getOwnPropertyNames
。(在本例中,对于
Object.getOwnPropertyNames
,它将按数字顺序升序,因为这些键符合数组索引的定义[是的,即使它不是数组]。@RickHitchcock:不使用这些键,它们符合“数组索引”的定义。从历史上看,实现对这些方面的处理与其他方面不同。是的,我的意思是不确定上面是否有更新;)谢谢你的洞察力。谢谢你的回答和解释!
let pages = response.query.pages;
Object.keys(pages).forEach(id => {
    let page = pages[id];
    console.log(page.title, page.foo);
});
for (key in response.query.keys)
{
    console.log(response.query[key].title);
}
try { 
    console.log(rate['bar'].rate)
  } catch (error) {
    console.log(error)
  }