Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.03.2015, 03:17
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 1  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
По умолчанию Нумерация в json

Код AS3:
var json_str:String = '[ "0":{"slot":"1","item_id":"8","name":"\u0420\u0436\u0430\u0432\u044b\u0439 \u043c\u0435\u0447","price":"25","amount":"1"},"1":{"slot":"1","item_id":"7","name":"\u041a\u043e\u0441\u0442\u0438","price":"100","amount":"2"},"2":{"slot":"2","item_id":"8","name":"\u0420\u0436\u0430\u0432\u044b\u0439 \u043c\u0435\u0447","price":"25","amount":"1"}]';
 var test:Array = com.adobe.serialization.json.JSON.decode(json_str); 
trace(test.length);
В общем пытаюсь декодировать строку, но не выходит. Как я понял, вся причина в нумерации "0": "1": и т.д. От чего ничего не выходит, если строка примет такой вид
Код AS1/AS2:
{"slot":"1","item_id":"8","name":"\u0420\u0436\u0430\u0432\u044b\u0439 \u043c\u0435\u0447","price":"25","amount":"1"},{"slot":"1","item_id":"7","name":"\u041a\u043e\u0441\u0442\u0438","price":"100","amount":"2"},{"slot":"2","item_id":"8","name":"\u0420\u0436\u0430\u0432\u044b\u0439 \u043c\u0435\u0447","price":"25","amount":"1"}
То все нормально декодируется. Подскажите решение, т.к флеш принимает от сервера именно ту строку(которая в самом начале поста)

Старый 12.03.2015, 09:26
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Ну, не правильная строка от сервера приходит. Кто сервер писал?
Дело тут совсем не в том, что там числа, а в том, что в простом массиве данные через двоеточие на записываются. То есть вместо вот такого:
Код AS3:
["0":{"slot":"1","item_id":"8","name":"\u0420\u0436\u0430\u0432\u044b\u0439 \u043c\u0435\u0447","price":"25","amount":"1"}]
Должно быть такое:
Код AS3:
{"0":{"slot":"1","item_id":"8","name":"\u0420\u0436\u0430\u0432\u044b\u0439 \u043c\u0435\u0447","price":"25","amount":"1"}}
Самое правильное решение - это сразу передавать с сервера строку в правильном формате.

Но если к серверу совсем нет никакого доступа, то можно придумать только костыльное решение, например с помощью регулярки
Код AS3:
var json_str:String = '[ "0":{"slot":"1","item_id":"8","name":"\u0420\u0436\u0430\u0432\u044b\u0439 \u043c\u0435\u0447","price":"25","amount":"1"},"1":{"slot":"1","item_id":"7","name":"\u041a\u043e\u0441\u0442\u0438","price":"100","amount":"2"},"2":{"slot":"2","item_id":"8","name":"\u0420\u0436\u0430\u0432\u044b\u0439 \u043c\u0435\u0447","price":"25","amount":"1"}]';
 
			/*
				создаем регулярное выражение, которое ищет любое количество чисел, 
				окруженных двойными кавычками, после которых опционально может быть
				какое-то количество пустых символов, потом двоеточие и потом опять
				опциональное количество пустых символов. Присваиваем эту выборку переменной
				$1, так как это первые скобки в регулярке
			*/
			var regExp:RegExp = /("\d+"\s*:\s*)/gi; 
			/*
				дальше заменяем содержимое переменной $1 на нее же, только перед ней 
				ставим фигурную скобку
			 */
			json_str = json_str.replace(regExp, "{$1");
			/*
				делаем то же самое для правой части
			 */
			regExp = /("}),/gi; 
			json_str = json_str.replace(regExp, "$1},");
			/*
				теперь ищем либо левую квадратную скобку в начале строки, перед которой и после
				которой так же могут быть опциональные пробелы в любом количестве,
				либо правую скобку, после которой могут быть опциональные пробелы, а потом сразу 
				конец строки. И заменяем это все на пустые строки
			 */
			regExp = /(^\s*\[\s*)|(\]\s*$)/gi;
			json_str = json_str.replace(regExp, "");
			// теперь JSON нормально распарсится
			trace(api.com.adobe.json.JSON.decode(json_str));

Старый 12.03.2015, 11:55
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 3  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
А в чем собственно разница такого
Цитата:
["0":{"slot":"1","item_id":"8","name":"\u0420\u0436\u0430\u0432\u044b\u0439 \u043c\u0435\u0447","price":"25","amount":"1"}]
От такого
Цитата:
{"0":{"slot":"1","item_id":"8","name":"\u0420\u0436\u0430\u0432\u044b\u0439 \u043c\u0435\u0447","price":"25","amount":"1"}}
Оба варианта не декодятся) Доступ к серверу есть если что.


Последний раз редактировалось Godwarlock; 12.03.2015 в 12:08.
Старый 12.03.2015, 12:18
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 4  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
Разница в том, что первый вариант не правильный. Второй парсится у меня норм, считывается первый элемент тоже.
Массив задается так [{"id":1},{"id":2}].

Старый 12.03.2015, 12:23
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 5  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Цитата:
Сообщение от faraday Посмотреть сообщение
Разница в том, что первый вариант не правильный. Второй парсится у меня норм, считывается первый элемент тоже.
Массив задается так [{"id":1},{"id":2}].
А можешь пример показать? Не допру никак, что у меня не правильно. Разница между первым и вторым вариантом, лишь в том, что в начале и в конце {} скобки, вместо квадратных. Но так или иначе, строка не декодится.

Цитата:
Массив задается так [{"id":1},{"id":2}].
[/quote]
Это строка которую должен отправлять сервер или это у тебя уже декодированая строка?
Сори что задаю такие тупые вопросы, джейсон просто до этого не юзал, использовал xml

Добавлено через 1 час 20 минут
В общем так то разобрался вроде как. Но вот почему
Код AS3:
 var test:Array = com.adobe.serialization.json.JSON.decode(json_str);
Не получается через Array данные выводить. Только через test:Object. Но object мне не подходит, т.к не срабатывает test.length.

Добавлено через 1 час 35 минут
Всё. Вроде разобрался теперь и с lenght. Кстати как оказалось, всё правильно возвращал сервер, это моя криворукость забыла про скобки)

Старый 12.03.2015, 18:41
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 6  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Разница между первым и вторым вариантом, лишь в том, что в начале и в конце {}
Ну, во-первых разница между фигурными и квадратными скобками принципиальна. А во-вторых это не единственная разница. Почитай внимательнее мой ответ с регулярками. Эти фигурные скобки там добавляются как закрывающий элемент после каждой логической части.
Цитата:
Доступ к серверу есть если что.
Тогда в чем вообще проблема? Зачем было создавать эту тему, если можно было сразу с сервера правильную строку отдавать?
Если там php, то в нем проще простого массив перегнать в JSON, через нативный json_encode(), и он точно отдаст правильную строку

Старый 13.03.2015, 00:05
Godwarlock вне форума Посмотреть профиль Отправить личное сообщение для Godwarlock Найти все сообщения от Godwarlock
  № 7  
Ответить с цитированием
Godwarlock

Регистрация: Jan 2012
Сообщений: 836
Проблемы нет. Моя оплошность. А можно каким-то образом вывести отдельные json строки? Ну например как то так
<lok_1>json строка</lok_1>
<lok_2>json строка</lok_2>
<lok_3>json строка</lok_3>
А во флеше обращаться к строкам типо того
e.target.data.lok_1
e.target.data.lok_2 и т.д

Старый 13.03.2015, 06:26
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Можно добавить все строки в массив на сервере, а потом этот массив превратить в JSON. Все JSON парсеры понимают что и как нужно превратить в массив

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:26.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:26.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.