Javascript Nodejs从JSON获取密钥

Javascript Nodejs从JSON获取密钥,javascript,json,node.js,Javascript,Json,Node.js,我正在nodejs中读取一个json文件,并希望在处理json对象之前在该对象中找到一个特定的键: fs.readFile('./output.json', 'utf8', function(err, data) { if (err) throw err; console.log(Object.keys(data)); }); 问题是,它以字符串形式返回一个数字数组: [ '0', '1', '2', '3', '4' ... ] 当我的

我正在nodejs中读取一个json文件,并希望在处理json对象之前在该对象中找到一个特定的键:

fs.readFile('./output.json', 'utf8', function(err, data) {
        if (err) throw err;
        console.log(Object.keys(data));

});
问题是,它以字符串形式返回一个数字数组:

[ '0',
  '1',
  '2',
  '3',
  '4'
  ... ]
当我的json文件有这样的文本时。为什么会这样

[{
    "id": "vdhbsasqzqnbx2od",
    "message": "On Sun, Jan 1, 2012 at 8:17 AM, Alan Stern <ste...@rowland.harvard.edu> wrote:As Linus pointed out, the real problem here 
}, { ...
}]
[{
“id”:“vdhbsasqzqnbx2od”,
“信息”:“2012年1月1日星期日上午8:17,艾伦·斯特恩写道:正如莱纳斯指出的,这里真正的问题是
}, { ...
}]

首先需要对数据运行JSON.parse(),然后可以循环访问数据并访问各种属性,如id和消息:

fs.readFile('./output.json', 'utf8', function(err, data) {
    if (err) throw err;
    var json = JSON.parse(data);

    json.forEach(function(arrayItem) {
        console.log(arrayItem.message);
    });
});

首先需要对数据运行JSON.parse(),然后可以循环访问数据并访问各种属性,如id和消息:

fs.readFile('./output.json', 'utf8', function(err, data) {
    if (err) throw err;
    var json = JSON.parse(data);

    json.forEach(function(arrayItem) {
        console.log(arrayItem.message);
    });
});

变量
data
是一个缓冲区,因此当您将它传递给
对象.keys
时,它返回字符串字符的键(0,1,2,3,…)

您希望使用
JSON.parse
首先解析数据,然后将结果对象传递给
object.keys

fs.readFile('./output.json', 'utf8', function(err, data) {
        if (err) throw err;
        console.log(Object.keys(JSON.parse(data)));

});

编辑:将“字符串”更改为“缓冲区”,注释中指出了这一点。

变量
数据
是一个缓冲区,因此当您将其传递给
对象时。keys
将返回字符串字符的键(0、1、2、3,…)

您希望使用
JSON.parse
首先解析数据,然后将结果对象传递给
object.keys

fs.readFile('./output.json', 'utf8', function(err, data) {
        if (err) throw err;
        console.log(Object.keys(JSON.parse(data)));

});

编辑:将注释中指出的“字符串”更改为“缓冲区”。

首先循环数组
[]
,然后循环对象
{}

var obj=[{“id”:“abc”,“message”:“这是一条消息”},{“id”:“def”,“message”:“另一条消息”}];
对于(变量i=0;i}
首先循环数组
[]
,然后循环对象
{}

var obj=[{“id”:“abc”,“message”:“这是一条消息”},{“id”:“def”,“message”:“另一条消息”}];
对于(变量i=0;i}
在我回答为什么会得到['0'、'1'等]结果之前,让我们看看
数据的样子。
fs.readFile()
不会给你一个对象。它也不会给你一个字符串。
数据
就是节点

现在,当您有一个缓冲区,并在其上运行一个
对象.keys()
,它会返回索引(很明显,索引是
0、1、2等

因此,要解决您的问题,您需要读取数据,将缓冲区转换为有效的JSON。完成此操作后,您的对象将基本上成为一个对象数组。现在您可以对对象数组执行任何操作。例如,如果您想获取所有消息,可以使用
array.prototype.map
。查看以下示例:

fs.readFile('./output.json', (err, data) => {
    if (err) throw err;

    // This is very important! Whenever you parse a JSON, you have to use try/catch
    try {
        let myArray = JSON.parse(data);
        console.log(myArray.map(item => item.message);
    } catch (exc) {
        console.log('Invalid json:', exc);
    }
});

在回答为什么会得到['0'、'1'等]结果之前,让我们先看看
数据的样子。
fs.readFile()
不会给你一个对象,也不会给你一个字符串。
数据
就是节点

现在,当您有一个缓冲区,并在其上运行一个
对象.keys()
,它会返回索引(很明显,索引是
0、1、2等

因此,要解决您的问题,您需要读取数据,将缓冲区转换为有效的JSON。完成此操作后,您的对象将基本上成为一个对象数组。现在您可以对对象数组执行任何操作。例如,如果您想获取所有消息,可以使用
array.prototype.map
。查看以下示例:

fs.readFile('./output.json', (err, data) => {
    if (err) throw err;

    // This is very important! Whenever you parse a JSON, you have to use try/catch
    try {
        let myArray = JSON.parse(data);
        console.log(myArray.map(item => item.message);
    } catch (exc) {
        console.log('Invalid json:', exc);
    }
});

看起来您的./output.json包含一个数组,因此如果您想对该数组中的每个对象执行操作,您可以执行data.forEach(x=>console.log(x))etclook与您的./output.json类似,因此如果您想对该数组中的每个对象执行操作,您可以执行data.forEach(x=>console.log(x))etclooketcIt不是字符串,它是缓冲区。它不是字符串,它是缓冲区。哦,天哪。再次..永远,请永远,永远不要在不将其包装到try/catch块的情况下执行JSON.parse。再次..永远,请永远,永远不要在不将其包装到try/catch块的情况下执行JSON.parse