JSON и ActionScript 2.0/3.0

Совсем недавно я касался темы использования XML для хранения и передачи данных (пост ActionScript 3.0: загрузка и обработка XML-файлов). Но XML не является единственным решением, когда речь заходит о необходимости сохранять данные или передавать их другим программам. Популярной альтернативой XML-у сейчас является JSON - это текстовый формат обмена данными, основанный на синтаксисе языка JavaScript. Останавливаться на JSON более подробно я не буду. Для этого существуют специальные ресурсы, например, сайт http://json.org. Скажу только, что JSON имеет чрезвычайно простой и понятный синтаксис. А ещё он более компактный, чем XML.

Приведём пример.

В посте про XML наши данные хранились в виде следующего xml-документа...

Код XML:

<?xml version="1.0" encoding="utf-8"?> <doc> <mywidth>300</mywidth> <myheight>200</myheight> <mycolor>0xff0000</mycolor> <mytext>мой текст</mytext> </doc>

То же самое, но уже на JSON можно записать так...

Код JSON:

{"mytext":"мой текст","mycolor":16711680,"myheight":200,"mywidth":300}

Разница очевидна. Правда, есть и ещё одно очевидное различие: XML более "человекочитабелен", чем JSON. Именно поэтому, в JSON легче допустить ошибку и гораздо труднее эту ошибку найти и исправить. Но тут нам на помощь приходят валидаторы. Например, JSONLint. Если у вас возникают какие-то проблемы при работе с форматом JSON, то первым делом проверьте сам json-документ на валидность...

Как работать с JSON в ActionScript-е?

Довольно просто. Есть немало готовых решений как для превращения данных в JSON-формат, так и для обратного преобразования. Но сегодня я остановлюсь только на одном таком решении, которое известно под названием JSON Lite (как я понял, "Lite" - это "камень в огород" corelib от Adobe, где тоже имеется класс для работы с JSON). Приятная особенность JSON Lite заключается в том, что с ним почти одинаково можно работать и в ActionScript 2.0, и в ActionScript 3.0. Естественно, что для AS 2.0 и AS 3.0 нам понадобится импортировать разные классы, но принцип работы с этими классами одинаков. Кстати, сами классы прилагаются к данному посту (ищи ссылку в конце статьи).

Итак, ближе к телу...

Наверно, вы согласитесь, что сложнее всего передавать и сохранять данные, существующие в виде массивов (как индексированных массивов, так и ассоциативных массивов). Но с помощью JSON Lite эта проблема решается двумя строчками кода...

Код ActionScript 2.0/3.0:

/* импортируем класс */ import com.serialization.json.JSON; /* массив, который нам надо преобразовать в JSON */ var arr:Array = [300, 200, 0xff0000, "мой текст"]; /* преобразуем индексированный массив в JSON-формат */ var json:String = JSON.serialize(arr);

Теперь в переменной json хранится строка в Json-формате. Эту строку мы можем сохранить в виде отдельного текстового файла или передать другим программам (работать с JSON умеют все популярные языки программирования).

Как же эту строку обратно превратить в индексированный массив? Весьма просто...

Код ActionScript 2.0/3.0:

/* импортируем класс */ import com.serialization.json.JSON; /* массив, который нам надо преобразовать в JSON */ var arr:Array = [300, 200, 0xff0000, "мой текст"]; /* преобразуем индексированный массив в JSON-формат */ var json:String = JSON.serialize(arr); /* превращаем JSON-строку в индексированный массив */ var obj:Array = JSON.deserialize(json); /* проверяем - достаём первый элемент массива */ trace(obj[0])

Аналогично можно работать и с ассоциативными массивами...

Код ActionScript 2.0/3.0:

/* импортируем класс */ import com.serialization.json.JSON; /* ассоциативный массив, который нам надо преобразовать в JSON */ var myObj:Object = new Object(); myObj.mywidth = 300; myObj.myheight = 200; myObj.mycolor = 0xff0000; myObj.mytext = "мой текст"; /* преобразуем ассоциативный массив в JSON-формат */ var json:String = JSON.serialize(myObj); /* выводим результат */ trace("JSON-строка: " + json) /* превращаем JSON-строку в ассоциативный массив */ var obj:Object = JSON.deserialize(json); /* с помощью цикла for in перебираем массив, выводя имена свойств и их значения */ for (var prop:String in obj) { trace("свойство " + prop + " со значением " + obj[prop]) ; }

Вот, пожалуй, и всё, что я хотел сегодня рассказать. Скачать исходники (под Adobe Flash CS5.5) и сами классы для работы с JSON (под AS 2.0 и AS 3.0) можно здесь - скачать исходник.

Автор: admin

Дата добавления: 2012-06-26

Просмотров: 4431

Рейтинг поста: +9-

Правила перепечатки

Социальные закладки:
Комментарии:
Комментатор
Комментарий добавил(а): Андрей
Дата добавления: 2013-06-28
Точно, спасибо
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2013-06-27
А по примеру ли делаете? Нет, конечно. Потому что, если бы вы следовали примеру, то ваш код выглядел бы примерно так:

var str:String = '[1,2,3,4,5]';
var arr:Array = JSON.deserialize(str);
trace(arr[3])

Улавливаете разницу?

Если так нужен массив, то получите ассоциативный массив и работайте с ним:

var str:String = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var obj:Object = JSON.deserialize(str);
trace(obj.a)
trace(obj.b)
trace(obj.c)
Комментатор
Комментарий добавил(а): Андрей
Дата добавления: 2013-06-27
Здравствуйте. Подскажи пожалуйста почему не работает? Делал по примеру.

var str:String="{"a":1,"b":2,"c":3,"d":4,"e":5}";
var arr:Array = JSON.deserialize(str);
trace(arr[0])
Выводит ошибку: TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать Object@26324ac1 в Array.
Добавить комментарий:







[ + ] помощь по форматирование текста

Идиот-тест

Если все обязательные поля (отмечены * ) заполнены необходимой информацией, то нажимаем кнопку Добавить комментарий.

Меню
Подписка
Рубрики
Метки
Последние комментарии
Рейтинг постов
Реклама
Друзья
География гостей
Статистика
Яндекс.Метрика