Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Нумерация в json (http://www.flasher.ru/forum/showthread.php?t=210423)

Godwarlock 12.03.2015 03:17

Нумерация в 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"}

То все нормально декодируется. Подскажите решение, т.к флеш принимает от сервера именно ту строку(которая в самом начале поста)

caseyryan 12.03.2015 09:26

Ну, не правильная строка от сервера приходит. Кто сервер писал?
Дело тут совсем не в том, что там числа, а в том, что в простом массиве данные через двоеточие на записываются. То есть вместо вот такого:
Код 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));


Godwarlock 12.03.2015 11:55

А в чем собственно разница такого
Цитата:

["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"}}
Оба варианта не декодятся) Доступ к серверу есть если что.

faraday 12.03.2015 12:18

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

Godwarlock 12.03.2015 12:23

Цитата:

Сообщение от faraday (Сообщение 1179968)
Разница в том, что первый вариант не правильный. Второй парсится у меня норм, считывается первый элемент тоже.
Массив задается так [{"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. Кстати как оказалось, всё правильно возвращал сервер, это моя криворукость забыла про скобки)

caseyryan 12.03.2015 18:41

Цитата:

Разница между первым и вторым вариантом, лишь в том, что в начале и в конце {}
Ну, во-первых разница между фигурными и квадратными скобками принципиальна. А во-вторых это не единственная разница. Почитай внимательнее мой ответ с регулярками. Эти фигурные скобки там добавляются как закрывающий элемент после каждой логической части.
Цитата:

Доступ к серверу есть если что.
Тогда в чем вообще проблема? Зачем было создавать эту тему, если можно было сразу с сервера правильную строку отдавать?
Если там php, то в нем проще простого массив перегнать в JSON, через нативный json_encode(), и он точно отдаст правильную строку

Godwarlock 13.03.2015 00:05

Проблемы нет. Моя оплошность. А можно каким-то образом вывести отдельные 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 и т.д

caseyryan 13.03.2015 06:26

Можно добавить все строки в массив на сервере, а потом этот массив превратить в JSON. Все JSON парсеры понимают что и как нужно превратить в массив


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

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