Javascript Nodejs从JSON获取密钥
我正在nodejs中读取一个json文件,并希望在处理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' ... ] 当我的
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