Совсем недавно я касался темы использования 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) можно здесь - скачать исходник.