Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > взять значения массива JSON


Автор: Samotnik 17.3.2008, 18:47
САБЖ!
С сервера приходит сформированный JSON массив.  Такого вида
Код

var config=[{"id":16,"props":{
"imgArray":[
"{'link':'controller/ShowAction?userid=3&fileid[80]&moduleid=16' ,'description': '[blue hills ]'}",
"{'link':'controller/ShowAction?userid=3&fileid[83]&moduleid=16' ,'description': '[sunset]'}",
"{'link':'controller/ShowAction?userid=3&fileid[82]&moduleid=16' ,'description': '[water]'}",
"{'link':'controller/ShowAction?userid=3&fileid[81]&moduleid=16' ,'description': '[winter]'}"],
"mode":"1"}}]

Мне нужно все значения  link   записать  в одигн массив,   а все значения  description  в  другой ! 
Вот так вот я  выбираю сам массив 
Код

 var conf = getModuleConfig(this.id);
 this.ImageArray = conf.imgArray;

Т.е.  в this.ImageArray  лежит  массив  imgArray  и вот из этого массива, мне нужно взять отдельно значения  link  и description
 smile 

Автор: dsCode 17.3.2008, 19:12
Samotnik,

- создать два пустых массива var links = []; и var descriptions = [];
- пройтись циклом по массиву this.ImageArray
- в массив links добавлять this.ImageArray[k].link, в массив descriptions - this.ImageArray[k].description

Автор: Sardar 17.3.2008, 20:03
dsCode, там не объект и подсветка это подтверждает. Зачем нужно было оборачивать это в двойные кавычки... Samotnik, ты с каждым разом удивляешь всё больше smile

По теме (добавим eval к коду dsCode):
Код
for(var i=0; i < this.ImageArray.length; i++) {
  var row = eval(this.ImageArray[i]);
  alert(row.link);
  alert(row.description);
}


Автор: Samotnik 18.3.2008, 17:00
По САБЖ
не работает !
пишу
Код

  var conf = getModuleConfig(this.id);
   this.ImageArray = conf.imgArray;
  for(var i=0; i < this.ImageArray.length; i++) {
   var row = eval(this.ImageArray[i]);
   alert(row.link);
   alert(row.description);
}

выдает
Цитата

invalid label
[Break on this error] {'link':'controller/ShowAction?userid=3&fileid[80]&moduleid=16' ,'descripti...

Автор: Fortop 18.3.2008, 17:23
1. Уже писал Sardar

Код

var config=[{"id":16,"props":{
"imgArray":[
{'link':'controller/ShowAction?userid=3&fileid[80]&moduleid=16' ,'description': '[blue hills ]'},
{'link':'controller/ShowAction?userid=3&fileid[83]&moduleid=16' ,'description': '[sunset]'},
{'link':'controller/ShowAction?userid=3&fileid[82]&moduleid=16' ,'description': '[water]'},
{'link':'controller/ShowAction?userid=3&fileid[81]&moduleid=16' ,'description': '[winter]'}],
"mode":"1"}}]


2.
Код

   this.ImageArray = config[0].props.imgArray;


3. Если и это не работает. Посмотри какой структуры у тебя приходит JSON.

Автор: Samotnik 18.3.2008, 17:55
Понимаете, все дело в том, что я не ставлю доп.  кавыки, они ставятся автоматически  smile 
Вобщем с сервера я отправляю так
Код

arrImages.put("[{'link':'controller/SlideShowAction?userid=" + userId + "&fileid" + Arrays.toString(num) +
                    "&moduleid=" + moduleId + "' ,'description': '" + Arrays.toString(str) + "'}]");

Это правильно ?   Вроде ж все правильно, по - форме  smile

Добавлено через 4 минуты и 37 секунд
Приходит вот так
Код

var config=
[{"id":16,"props":{"imgArray":
["[{'link':'controller/ShowAction?userid=3&fileid[80]&moduleid=16' ,'description': '[blue hills ]'}]",
"[{'link':'controller/ShowAction?userid=3&fileid[83]&moduleid=16' ,'description': '[sunset]'}]",
"[{'link':'controller/ShowAction?userid=3&fileid[82]&moduleid=16' ,'description': '[water]'}]",
"[{'link':'controller/ShowAction?userid=3&fileid[81]&moduleid=16' ,'description': '[winter]'}]"],
"mode":"1"}}]

Что тут не правильно ?? 

Автор: Fortop 18.3.2008, 18:01
Цитата(Samotnik @  18.3.2008,  17:55 Найти цитируемый пост)
arrImages.put

Не понял? Чем отправляешь с сервера? Это что за класс/модуль/функция? На каком языке?

Автор: Samotnik 18.3.2008, 18:11
Цитата(Fortop @  18.3.2008,  18:01 Найти цитируемый пост)
Не понял? Чем отправляешь с сервера? Это что за класс/модуль/функция? На каком языке?

Вообще это  Java   но  не суть!!   
Формирование   запросов/ответов   везде одинаковое, просто  вкаждом языке свои методы, для  этого!! 
Интересует, сам  JSON  массив      правильно  сформированн ?? 

Автор: Fortop 18.3.2008, 18:17
нет неправильно
Цитата(Samotnik @  18.3.2008,  17:55 Найти цитируемый пост)
["[{'link'

Вот эта двойная кавычка и соответственно парная ей. не нужны

Добавлено через 2 минуты и 58 секунд
P.S. А в великой и могучей разве нет встроенных функций для формирования JSON?

Автор: Samotnik 18.3.2008, 18:23
Цитата(Fortop @  18.3.2008,  18:17 Найти цитируемый пост)
от эта двойная кавычка и соответственно парная ей. не нужны

Так я это понял, еще когда впервый раз мне сказали  smile 
Вопрос в том, как  от нее избавиться ??   Ведь вы видите, что я ее не передаю !!   smile 
Это просто метод  ткаой   put  в который, надо в кавычках передавать всю  инфу ! 

Автор: Fortop 18.3.2008, 21:34
Цитата(Samotnik @  18.3.2008,  18:23 Найти цитируемый пост)
Это просто метод  ткаой   put  в который, надо в кавычках передавать всю  инфу ! 

Метод чей? Библиотечный?
В любом случае в Java можно посмотреть исходный код этого метода. Вот и посмотри.
А еще лучше посмотри другой метод smile тот, которым ты отдаешь в Java JSON строку

Добавлено @ 21:39
Цитата(Samotnik @  18.3.2008,  18:11 Найти цитируемый пост)
Вообще это  Java   но  не суть!!   
Формирование   запросов/ответов   везде одинаковое, просто  вкаждом языке свои методы, для  этого!! 
Интересует, сам  JSON  массив      правильно  сформированн ??  

Понимаешь в чем дело. Причина твоей проблемы только одна.
Ты не можешь определится с тем, где ошибка.

Если тебе приходит в JavaScript неправильный JSON - то стоит посмотреть, что у тебя уходит на стороне сервера.
Не то что ты формируешь и передаешь в .put, а то, что ты отдаешь каким-то методом...

Добавлено через 8 минут и 5 секунд
например вот так.

Код

// набиваем массив
someObj.put('string one');
someObj.put('[{"string1", "string2"}]');

// выводим как JSON - вот сюда смотреть и надо!
someObj.sendJSON

Автор: Samotnik 18.3.2008, 21:58
2 all
Пасибо всем !
Действительно был  метод, который  ложит всю красоту   в  JSON   обьект и  JSON  массив !!!

Автор: Samotnik 18.3.2008, 22:24
Окей,   вроде разобрался....  
Знчит, что новую тему не создавть, спрошу тут (т.к. это продолжение...)
Значит мне на клиент приходит такая вот строчка
Код

var config=[{"id":16,"props":
{"imgArray":
[{"description":"[winter]","link":"/controller/ShowAction?userid=3&fileid=[81]&moduleid=16"},
{"description":"[winter]","link":"/controller/ShowAction?userid=3&fileid=[81]&moduleid=16"},
{"description":"[winter]","link":"/controller/ShowAction?userid=3&fileid=[81]&moduleid=16"},
{"description":"[winter]","link":"/controller/howAction?userid=3&fileid=[81]&moduleid=16"}],
"mode":"1"}}]

Я беру значения вот так
Код

var conf = getModuleConfig(this.id);
     this.ImageArray = conf.imgArray;
  for(var i=0; i < this.ImageArray.length; i++) {
      alert(this.ImageArray[i].link);
     alert(this.ImageArray[i].description);
}

ВСе  ОК ! 
Но,  мне потом нужно передавать в различные  функции (их много 10  штук)  все эти значения!  Но проблема, в том, что я не могу понять, как передать, к примеру,  все значения  link ??
Ведь, если я напишу, к примеру
Код

if (this.ImageArray.link.length > 0) 

То будет ошибка !!   т.к. в ImageArray  нету link  в  нем есть только  [0,1,2,3]  (т.е.  массивы)  а уже в этих массивах, есть   link   и  description  и как  быть ?
Если я напишу
Код

if (this.ImageArray[0].link.length > 0) 

То ведь я возьму значение, только у первого элемента массива!  А их  в данном  случае 4 !!!   А может быть и больше будет!  
Что  можно тут  сделать ?? 
 


Автор: Samotnik 18.3.2008, 23:05
Пажалста,  Помогите!!    smile 
Это же реальная  проблема!!   


Автор: Nigel 18.3.2008, 23:47
Samotnik, а что конкретно не получается?
Размер массива вы знаете, размер вложенных в него массивов тоже.
Цитата
Но проблема, в том, что я не могу понять, как передать, к примеру,  все значения  link ??

Это? Смотрите 2-ой пост.

Автор: Samotnik 19.3.2008, 13:39
Блин,  либо вы не понимаете, либо я ! 
Значит матрите...  
Приходит массив с 2-я  массивами.  Я их разбиваю на 2 массива
Код

 var conf = getModuleConfig(this.id);
    this.linksArray  = [];
    this.descriptionArray= [];
  for(var i=0; i < conf.imgArray.length; i++) {
      this.linksArray[i] = conf.imgArray[i].link;
      this.descriptionArray[i] = conf.imgArray[i].description;
}

Т.е.  в this.linksArray   содержиться  массив!! элементов, и в this.descriptionArray тоже!!
Вот..  
Значит мне нужно:
Взять, к примеру, из  this.linksArray  первое значение ВСЕХ  элементов !!!  Сматрите, если я напишу вот так : this.linksArray[0]  то я возьму  первый элемент!!!  А мне нужно  СВОЙСТВО  ВСЕХ  элементов !!  
Если же я  напишу вот так   this.linksArray[0][0]  То я возьму то что мне надо  НО   это ведь будет  значение  для ПЕРВОГО элемента, а  мне нужно  взять  это первое свойство у  ВСЕХ  элментов!! 
Пэ.Эс.
Теперь  понятно ???

Автор: Fortop 19.3.2008, 15:27
smile Какое именно свойство? Ты можешь уточнить?
Ты понимаешь, что если элементов больше чем 1н, то и первое свойство у всех элементов - это будет список?

т.е. у тебя уже был массив  imgArray в котором у каждого элемента было два свойства link & description.
Чтобы выбрать все эти свойства тебе подсказали сделать цикл. Ты сделал и получил два массива которые содержат в себе нужные тебе свойства.
Например, this.linksArray - содержит именно первое свойство у ВСЕХ твоих элементов. А поскольку элементов больше 1го - то это массив!

Что именно тебе нужно сейчас?

Вот, модифицируй свой код таким образом и скажи что ты наблюдаешь.
Код

for(var i=0; i < conf.imgArray.length; i++) {
    this.linksArray[i] = conf.imgArray[i].link;
    this.descriptionArray[i] = conf.imgArray[i].description;
    // что у тебя выводят эти два алерта? Это то что ты ожидаешь?
    alert(this.descriptionArray[i]);
    alert(this.linksArray[i]);
}


Добавлено через 5 минут и 20 секунд
Да, и попутно сделай 

Код

alert(this.linksArray[0][0])

У меня выводится всего 1на буква 'c' это и правильно. Поскольку твоя запись означает буквально следующее
linksArray - взять все link.
первый [0] - взять link у первого элемента.
второй [0] - взять первый кусочек значения у link первого элемента.

В итоге, мы взяли список всех link, взяли первый из них и взяли первый символ этого link.

Я надеюсь ты понял?

Если да, то поясни, что именно ты хочешь. Ты можешь внятно сказать-  какая именно задача стоит перед тобой?

Добавлено через 7 минут и 20 секунд
Цитата(Samotnik @  19.3.2008,  13:39 Найти цитируемый пост)
Приходит массив с 2-я  массивами.  Я их разбиваю на 2 массива

У тебя приходит массив ОБЪЕКТов!
Где каждый из объектов имеет два свойства.
Вот эти свойства для всех элементов ты и вытаскиваешь в два отдельных массива!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)