【问题标题】:Node.js - Parse simple JSON object and access keys and valuesNode.js - 解析简单的 JSON 对象并访问键和值
【发布时间】:2012-10-31 07:04:23
【问题描述】:

我是 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' }

【问题讨论】:

  • “我也想以异步方式处理每个。” 嗯...为什么?
  • 仅供参考,节点运行在单线程中,因此异步与多线程编程不同。当您使用 fs.* 等本机异步过程进行异步调用时,它将向事件循环注册一个事件处理程序以等待作业完成。在其他情况下,您只需向 process.nextTick 事件注册一个事件处理程序,该事件将在每个滴答时回调,并且您的代码串联而不是并行运行。

标签: javascript json node.js object asynchronous


【解决方案1】:

如果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`
});

如果您需要对数组中的每一项进行异步处理,并且需要知道何时完成,我建议您查看一个异步帮助程序库like async--尤其是async.forEach may be useful for you

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
});

我稍微谈谈asyncin this screencast的异步处理。

【讨论】:

  • 这仅适用于将 connect/express 与 bodyParser 一起使用时。
  • @brandon-tiley 非常感谢。如何确认我的 request.body 是否已经被解析为 JSON?如果我输出store_config,它是一个对象:console.log(typeof(request.body.store_config)); console.log(request.body.store_config);object[ { name: 'hello', name2: 'world' } ]
  • 如果它是“object”,那么它已经被解析——解析将一个字符串变成一个对象。 (如果是字符串,尝试request.body.store_config 会出错。)
  • 当我尝试遍历数组时,只有一个值:request.body.store_config.forEach(function(item, index) { console.log(index); console.log(request.body.store_config[index]); }); 返回 - 0 { name: 'hello', name2: 'world' }
  • @Ben:这似乎是正确的,因为您的示例中有一个项目——一个具有namename2 两个属性的对象。
【解决方案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]);
   }
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-05-09
      • 2020-12-08
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多