Node.js - 解析简单的JSON对象并访问键和值

10

我是Node的新手,正在努力访问一个简单的JSON对象。我的request.body将具有类似以下内容的JSON内容:

{
    "store_config": [
        {
            "name": "hello",
            "name2": "world"
        }
    ]
}

"store_config"的值始终存在,但其中的键和值可能是任何内容。

我该如何遍历键和值以访问每个键值对? 我还想以异步方式处理每个键值对。

感谢任何想法或指导。


更新

console.log(typeof(request.body));

返回:Object

parsedBody = JSON.parse(request.body);

返回值:

SyntaxError: Unexpected token o
    at Object.parse (native)

更新2 - 进一步调试:

当我尝试遍历该数组时,只有一个值:

request.body.store_config.forEach(function(item, index) {
  console.log(index);
  console.log(request.body.store_config[index]);

});

返回:

0
{ name: 'hello', name2: 'world' }

我也想以异步方式处理每个。嗯...为什么? - Tomalak
请注意,Node.js 运行在单线程中,因此异步编程与多线程编程不同。当您使用类似 fs.* 的本地异步过程进行异步调用时,它会向事件循环注册一个事件处理程序来等待作业完成。在其他情况下,您只需向 process.nextTick 事件注册一个事件处理程序,它将在每个 tick 回调,并且您的代码是串行而非并行运行的。 - xiaoyi
3个回答

18
如果request.body已经被解析为JSON,您可以直接将其作为JavaScript对象访问数据;例如,
request.body.store_config

否则,您需要使用JSON.parse进行解析:
parsedBody = JSON.parse(request.body);

store_config是一个数组,因此您可以对其进行迭代:

request.body.store_config.forEach(function(item, index) {
  // `item` is the next item in the array
  // `index` is the numeric position in the array, e.g. `array[index] == item`
});

如果您需要对数组中的每个项目进行异步处理,并且需要知道何时完成,我建议您查看一个异步助手库例如async - 特别是, async.forEach 可能对您有用
async.forEach(request.body.store_config, function(item, callback) {
  someAsyncFunction(item, callback);
}, function(err){
  // if any of the async callbacks produced an error, err would equal that error
});

我在这个视频教程中简要介绍了使用async库进行异步处理。


@brandon-tilley 非常感谢。我该如何确认我的 request.body 已经被解析为 JSON?如果我输出 store_config,它是一个对象:console.log(typeof(request.body.store_config)); console.log(request.body.store_config);object[ { name: 'hello', name2: 'world' } ] - Ben
如果它是“对象”,那么它已经被解析了——解析将字符串转换为对象。(如果它是一个字符串,尝试执行request.body.store_config会导致错误。) - Michelle Tilley
当我尝试遍历数组时,只有一个值:`request.body.store_config.forEach(function(item, index) { console.log(index); console.log(request.body.store_config[index]);});`返回 - 0 { name: 'hello', name2: 'world' } - Ben
@Ben:看起来没问题,因为你的示例中只有一个项目——一个具有两个属性namename2的对象。 - Linus Thiel
好的,明白了!非常感谢大家,真的很有帮助。抄送linus-g-thiel和brandon-tilley。 - Ben
显示剩余2条评论

2

类似这样:

config = JSON.parse(jsonString);
for(var i = 0; i < config.store_config.length; ++i) {
   for(key in config.store_config[i]) {
      yourAsyncFunction.call(this, key, config.store_config[i][key]);
   }
}

-1

要将此字符串转换为实际对象,请使用JSON.parse。您可以像处理数组一样迭代JavaScript对象。

config = JSON.parse(string).store_config[0]
foreach (var key in config) {
    value = config[key]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接