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

时间:2015-02-04 10:50:14

标签: javascript json node.js

我有以下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格式不正确。也许我根本不需要盒子钥匙而只能将盒子作为阵列?

5 个答案:

答案 0 :(得分:2)

您正在尝试访问

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

答案 1 :(得分:2)

saveData.boxes 数组,因此无法使用length属性直接找到它的长度。

这就是你需要使用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

注意:我删除了盒子编号(在代码之前是键),如果需要,可以将它们放在数组中。

答案 2 :(得分:2)

我最终将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
}]

答案 3 :(得分:1)

Cameron,不确定你是否还有问题,但你可以做到

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

答案 4 :(得分:0)

尝试使用我修改过的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]]);
    }

}