Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Работа с JSON в FlashPlayer 11 (http://www.flasher.ru/forum/showthread.php?t=172956)

HardCoder 20.12.2011 21:25

Работа с JSON в FlashPlayer 11
 
Здравствуйте. Есть класс MCExample унаследованный от MovieClip. У него есть 2 свойства: prop1 и prop2.
Есть массив состоящий из обьектов класса MCExample. Нужно из этого массива создать строку в формате JSON.
Проблема в том, что метод JSON.stringify() пихает не только эти 2 свойства: prop1 и prop2 каждого элемента массива. Он туда всовывает все свойства, унаследованные от мувиклипа и все остольное унаследованное по цепочке аж до Object.
А мне нужно чтобы туда добавлялись лишь prop1 и prop2 каждого обьекта. Тоесть экземпляр класса MCExample с его единственными двумя свойствами. Подскажите, пожалуйста как это сделать. Знаю что это возможно. Надо похимичить над параметрами метода stringify() или переопределять метод toJSON(), но я не понимаю что это. Слишком умно как-то написано (хоть и на русском языке).

Добавлено через 16 минут
Все, наконец - то! С мыслью, что модераторы забанят за лень :) по строчке расшифровал адобовский язык. Значит, в классе MCExample надо создать метод
Код AS3:

public function toJSON(k:String):* {
      return {"prop1": prop1, "prop2": prop2};
}

Может кому пригодится.

goodguy 20.12.2011 21:51

это корявое решение

HardCoder 20.12.2011 21:52

Скажите, пожалуйста, а как сделать элегантно и более "быстроработающее"?

dimarik 20.12.2011 21:57

А вы в карму ему плюсаните, может подскажет.

Inet_PC 20.12.2011 22:04

Сначало код, а уж потом плюсик))
Ну как вариант. Ну я бы и как есть оставил.
Код AS3:

public function toJSONString():String 
{
      return '{"prop1": ' + prop1.toString() + ', "prop2": ' + prop2.toString() + '}';
}

Возможно будет быстрее, но менее универсально и легче ошибиться.

HardCoder 20.12.2011 22:11

Цитата:

Сообщение от Inet_PC (Сообщение 1052706)
Код AS3:

public function toJSONString():String 
{
      return '{"prop1": ' + prop1.toString() + ', "prop2": ' + prop2.toString() + '}';
}

Возможно будет быстрее, но менее универсально и легче ошибиться.

А разве стандартный JSON ищет при парсинге метод toJSONString()? В справке написано, что он ищет toJSON() в каждом проверяемом обьекте.
Если можно, еще вопрос об оптимизации. Приветствуется ли сокращения среди программистов? Например
Код AS3:

//Наши переменные        
var prop1:int = 384;
var prop2:Boolean = true;
//Вариант 1
//При создании строки JSON:
{ "prop1":prop1, "prop2":prop2 };
//получаем: {"prop1":384, "prop2":true }
//Вариант 2
//При создании строки JSON:
{ "p1":prop1, "p2":int(prop2) };
//получаем: {"p1":384, "p2":1}

Будет ли вариант 2 более благоприятным для парсера во время преобразования строки в обьект?

Inet_PC 20.12.2011 22:13

Цитата:

А разве стандартный JSON ищет при парсинге метод toJSONString()?
Это выдуманный мной метод.
Цитата:

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

HardCoder 20.12.2011 22:26

Ну, учитывая, что пока "все" на мне и ключей всего 4-5, то буду стараться минимизировать строки. Спасибо за внимание.

rs7 19.02.2013 18:52

Я вот всё равно не догоняю.

Справка

Цитата:

JSON.stringify() вызывает метод toJSON(), если он существует, для каждого общедоступного свойства, обнаруженного при прохождении объекта. Свойство содержит пару «ключ/значение». Когда stringify() вызывает метод toJSON(), он передает ключ, k, рассматриваемого в данный момент свойства. При типичной реализации метод toJSON() анализирует имя каждого свойства и возвращает желаемую кодировку его значения.
Прочитав справку я подумал что для экземпляра класса
Код AS3:

class A {
  public var a:int;
  public var b:int;
 
  public function toJSON(k:String):* { return "Trololo"; }
}

код
Код AS3:

JSON.stringify(new A());

выдаст
Цитата:

{"a":"Trololo","b":"Trololo"}

mayakwd 19.02.2013 20:53

Код AS3:

package {
        import flash.display.Sprite;
 
        public class JSONTest extends Sprite {
                public function JSONTest() {
                        trace(toJSON(new TestClass(), ITestClassInterface));
                }
        }
}
 
import flash.display.MovieClip;
import flash.utils.describeType;
 
interface ITestClassInterface {
        function get prop1() : String;
 
        function get prop2() : String;
}
 
class TestClass extends MovieClip implements ITestClassInterface {
        public function TestClass() {
                super();
        }
 
        public function get prop1() : String {
                return "123";
        }
 
        public function get prop2() : String {
                return "321";
        }
}
 
function toJSON(object : Object, fromInterface : Class) : String {
        var description : XML = describeType(fromInterface);
        var accessors : XMLList = description.factory..accessor;
        var resultObject : Object = {};
        for each (var accessor : XML in accessors) {
                var accessorName : String = accessor.@name.toString();
                resultObject[accessorName] = object[accessorName];
        }
        return JSON.stringify(resultObject);
}

Результат:
Код AS3:

{"prop1":"123","prop2":"321"}



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

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