2016-09-28 3 views
2

У меня есть JSON объекта отформатирован как {"Foo": ["B","A","R"]}Доступ массива внутри объекта JSON от живительной

Я пытаюсь получить доступ к значениям массива, как это:

var json = '{"Foo": ["B","A","R"]}'; 

expression = JSON.Parse(json, function(key, value){ 
      if(key == "Foo"){ 
      console.log(value.length); // logs "3" 
      console.log(value[1]);  // logs "undefined" 
      } 
     }); 

Если я прошу длины значения возвращает правильную длину массива, но если я запрашиваю значение, оно возвращает undefined, и я не совсем уверен, почему. В JSON есть другие значения, что я могу получить доступ просто отлично, но они не являются массивами , Любое понимание было бы оценено. Благодаря!

+0

Это ваш фактический код? 'value'! ==' Valid' –

+0

У вас есть проблема с структурой JSON var json = '{"Foo": ["B", "A", "R"]}'; Двойные кавычки и одинарные кавычки конфликтуют – Gary

+0

Не мой фактический код, фактический код работает с остальными значениями JSON, но не с массивом. – MrPickle

ответ

4

Вы должны использовать JSON.parse так:

var json = '{"Foo":["B","A","R"]}'; 
var object = JSON.parse(json); 
// object is now and object containing the data from 'json' 

var expression = object["Foo"][1]; // object["Foo"] refers to the 
            // value with key "Foo" 

(Вызов JSON.parse с параметром обратного вызова является усовершенствованная функция для преобразования объекта JSON, а не читать его в почти всех случаях, однако, вы хотите использовать. это как приведенный выше код, без обратных вызовов.)

+1

Я пытаюсь разобрать его в объект, чтобы я мог взять их и построить другой объект, основанный на том, что держит JSON, и это имеет смысл. Однако я собираюсь попробовать его без обратного вызова. Благодаря! – MrPickle

+1

Это не отвечает на вопрос, почему исходный код не работает. –

+0

@torazaburo Действительно, это не так, но IMO проблема заключалась в том, что обратный вызов не должен использоваться, чтобы просто читать объект JSON в любом случае. Ответы не обязательно о * ответе на литеральный вопрос *, речь идет о * решении проблемы *, которую я думаю, что мой ответ попытался сделать. – Frxstrem

0

использовать этот код

var json = {'foo' : ['B', 'A', 'R']}; 
    $.each(json, function(key, value){if(key == 'foo'){console.log(value[1]);}}); 

у вас уже есть объект JSON, нет нужно снова проанализировать его.

+0

Я действительно читаю его из файла, поэтому я его разбираю. – MrPickle

+0

Что такое '$ .each'? Что такое «объект JSON»? Поскольку 'json' является строкой, почему бы ему не разобрать ее? –

+0

lol jQuery в 2016 году .. просто используйте встроенный Object.keys/Object.entries и .forEach или .map. – cchamberlain

1

Как уже упоминалось в другом ответе, если вы просто хотите получить второй элемент Foo, вы можете сделать это достаточно легко после разбора с использованием стандартных методов доступа к свойствам, таких как obj.Foo[1].

Предполагая, что вы действительно хотите использовать необязательный второй параметр «Reviver» в JSON.parse, вам необходимо вернуть значение из «Reviver» обратного вызова;

expression = JSON.Parse(json, function(key, value){ 
    if (key == "Foo"){ 
    console.log(value[1]); 
    } 
    return value; 
    ^^^^^^^^^^^^^ 
}); 
0

Причина, по-видимому, вы не можете получить доступ к значение [1], но вы можете получить доступ к value.length (как упомянуто user663031) не имеет возвращаемого значения.

Функция reviver заменяет одно значение другим, если возврат не указан, все функции возвращаются undefined. Порядок, в котором получатель получает значения: первый из значений в массиве отдельно, затем массив.

В вашем коде каждое значение уже было заменено на «undefined», поэтому массив имеет три неопределенных значения, о которых сообщает длина. value[1] действительно возвращает значение в позиции 1, но установлено значение «undefined».

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