努力用NodeJS以期望的格式获取JSON

我有以下JSON:

{ "boxes" : { "box-1" : { "what": "lose", "opened": false }, "box-2" : { "what": "lose", "opened": false }, "box-3" : { "what": "lose", "opened": true }, "box-4" : { "what": "win", "opened": false }, "box-5" : { "what": "lose", "opened": true }, "box-6" : { "what": "unknown", "opened": false }, "box-7" : { "what": "lose", "opened": true }, "box-8" : { "what": "lose", "opened": false } } } 

当我加载到我的应用程序(我正在使用NodeJS):

 var save = __dirname + '/save.json'; var saveData = fs.readFileSync(save, 'utf8'); if(saveData) reloadGame(saveData); else askBoxes(); function reloadGame(saveData) { saveData = JSON.parse(saveData); boxes = Object.keys(saveData.boxes).length; for(var i=0;i<=boxes;i++) { console.log(saveData.boxes[i]); } } 

看到我不得不使用Object.key来获得长度。 而我的console.log在我的for循环中返回undefined。

我通常不必使用Object.keys来获取JSON文件中的东西的长度…为什么我的console.log没有工作?

感觉像JSON格式不正确。 也许我根本不需要盒子的钥匙,而只需要将盒子作为一个数组呢?

saveData.boxes 不是数组,因此无法直接使用length属性查找它的length

这就是你需要使用object.keys来查找长度的object.keys ,如果你不需要这个,你可以把数组的列表转换成数组。

改变你的json到这个:

 { "boxes": [ { "what": "lose", "opened": false }, { "what": "lose", "opened": false }, { "what": "lose", "opened": true }, { "what": "win", "opened": false }, { "what": "lose", "opened": true }, { "what": "unknown", "opened": false }, { "what": "lose", "opened": true }, { "what": "lose", "opened": false } ] } 

这样你就可以访问代码中for loop的方框,也不需要Object.keys

注意 :我删除了框号(这是在你的代码之前的键),如果你想要它们,你可以把它们放在数组中。

您正在尝试访问

 saveData.boxes[0], saveData.boxes[1] and so on. 

您需要访问:

 saveData.boxes["box-1"], saveData.boxes["box-2"] etc 

你可以使用这个:

 boxes = Object.keys(saveData.boxes); for(var i=0;i<boxes.length;i++) { console.log(saveData.boxes[boxes[i]); } 

我结束了将JSON转换为:

 [{ "box": "box-1", "what": "lose", "opened": false }, { "box": "box-2", "what": "lose", "opened": false }, { "box": "box-3", "what": "lose", "opened": true }, { "box": "box-4", "what": "win", "opened": false }, { "box": "box-5", "what": "lose", "opened": true }, { "box": "box-6", "what": "unknown", "opened": false }, { "box": "box-7", "what": "lose", "opened": true }, { "box": "box-8", "what": "lose", "opened": false }] 

卡梅伦,不知道你是否仍然有这个问题,但你可以干脆

 var tempBoxes = saveData.boxes; for(var i in tempBoxes){ console.log(tempBoxes[i]); } 

尝试使用我修改的reloadGame函数

 function reloadGame(saveData) { saveData = JSON.parse(saveData); boxes = Object.keys(saveData.boxes); for(var i=0;i<=Object.keys(saveData.boxes).length;i++) { console.log(saveData.boxes[boxes[i]]); } }