2015-02-04 2 views
1

У меня есть следующие JSON:Стараясь получить JSON в желаемом формате с NodeJS

{ 
    "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 s, чтобы получить длину. И мой console.log возвращает undefined внутри цикла for.

Обычно я не использую Object.keys, чтобы получить длину чего-то внутри файла JSON ... И почему мой консольный.log не работает?

Чувства, подобные JSON, некорректно отформатированы. Может быть, мне не нужен ключ коробки вообще, и у меня могут быть только коробки в виде массива?

ответ

1

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.

Примечание: Я удалил номера ящиков (которые были ключами ранее в вашем коде), если вы хотите их, вы можете поместить их в массив.

+0

Как переформатировать его, чтобы стать массивом? Я попытался, но продолжал беспорядок JSON ... – Cameron

+0

@Cameron .. добавил формат 'JSON' –

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

@Naeem Я полагаю, это решительно решает вашу проблему. –

1

Я в конечном итоге преобразование 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 
}] 
+0

То же, что и я предложил .. –

+0

@NaeemShaikh Да, я знаю :) Я уже создал файл, прежде чем увидел ваш комментарий относительно номеров ящиков. – Cameron

+1

В этом случае +1 приятель –

1

Кэмерон, не уверен, если вы все еще есть проблемы, но вы могли бы просто сделать

var tempBoxes = saveData.boxes; 
for(var i in tempBoxes){ 
    console.log(tempBoxes[i]); 
} 
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]]); 
    } 

} 
Смежные вопросы