Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   JSON -> XML ? (http://www.flasher.ru/forum/showthread.php?t=146869)

mikhailk 20.11.2010 00:34

JSON -> XML ?
 
Сейчас пользуюсь классом JSON от Adobe, но там преобразование происходит в объект. По ряду причин мне нужно, чтобы это был XML.

Писать самому ручками или есть какое готовое решение? Что-то я не нашел.

Mur4ik 20.11.2010 02:16

А объект после этого в XML это долго разве?

mikhailk 20.11.2010 12:21

да нет, понятно, что надо пройтись по его свойствам и сформировать xml
при этом, очевидно, на любом уровне может оказаться массив, так что сам обход надо делать с рекурсией

но если есть библиотека, в которой решено все под ключ, то чего изобретать велосипед? потом еще xml->json может понадобиться

интересно, кстати, почему адоб сам не добавил метод JSON.decodeToXML(strJSON) в собственную библиотеку?

cleptoman 20.11.2010 12:38

потому что Объект - это объект, а ХМЛ - это неведомая штука, в которой не понятно что будет узлами, что атрибутами, что будет заворачиваться в сидату, что нет и т.д..очень много "НО".

mikhailk 20.11.2010 12:59

да ладно
чего бы не отдавать какой-нибудь вариант simpleXML, состоящий из одних узлов, безо всяких атрибутов и прочей шелухи?

cleptoman 20.11.2010 13:50

ок..как вариант

Код AS3:

var obj:Object = new Object();
obj.param = "</blabla";

как преобразовать в XML?

f.g.programmer 20.11.2010 14:00

Все строковые значения можно пихать в <![CDATA[]]>

mikhailk 20.11.2010 14:03

видимо, как-то так:

Код:

<obj>
  <param>&lt;/blabla</param>
</obj>


cleptoman 20.11.2010 14:48

f.g.programmer, не панацея )

Код AS3:

var obj:Object = new Object();
obj.param = "blabla]]>";

mikhailk получается все нужно конвертить..хз насколько состоятельна эта затея (

mikhailk 20.11.2010 14:58

не конвертить, а экранировать

ну, так получение xml - это ж не самоцель.
я с ним потом работаю.

Mur4ik 20.11.2010 18:00

Не изобретайте велосипед, гляньте на класс SimpleXMLEncoder, вполне способен справится с Вашей задачей.

Код AS3:

private function objectToXML(object:Object, rootNode:String = "root"):XML
{
        import mx.rpc.xml.SimpleXMLEncoder;
 
        var xmlDocument:XMLDocument = new XMLDocument();
        var xmlEncoder:SimpleXMLEncoder = new SimpleXMLEncoder(xmlDocument);
        xmlEncoder.encodeValue(object, new QName(rootNode), xmlDocument);
 
        return new XML(xmlDocument.toString());
}

Правда в чистом виде он тащит за собой около 20Кб флексовых классов, но это не проблема, я когда то делал из него независимую версию, вышло что то около 5Кб по итогу. Если нужно попробую отрыть и прикреплю тут.

mikhailk 20.11.2010 18:14

о, на что-то такое я и надеялся :)
буду смотреть

Добавлено через 1 час 18 минут
все работает

возможно, кому понадобится полностью (оформил как простой код, поскольку в AS3 перекодируется JSON):

Код:

package
{
        import flash.display.*;
        import flash.events.*;
        import flash.xml.*;
        import mx.rpc.xml.SimpleXMLEncoder;
        import com.adobe.serialization.json.*;       
       
        public class Main extends Sprite
        {
               
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
               
                private function init(e:Event = null) : void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                       
                        var stringJSON:String = '{"param1":"1","param2":"</blabla","param3":"blabla]]>",'
                                      +'"paramArray":[{"id":"1","value":"111"},{"id":"2","value":"222"}]}';

                        var objXML:XML = jsonToXML(stringJSON);
                        trace(objXML);
                }
               
                private function jsonToXML(stringJSON:String) : XML
                {
                        var obj:Object = JSON.decode(stringJSON);
                        var objXML:XML = objectToXML(obj);
                       
                        return(objXML);
                }
               
                private function objectToXML(object:Object, rootNode:String = "root") : XML
                {
                        var xmlDocument:XMLDocument = new XMLDocument();
                        var xmlEncoder:SimpleXMLEncoder = new SimpleXMLEncoder(xmlDocument);
                        xmlEncoder.encodeValue(object, new QName(rootNode), xmlDocument);
               
                        return new XML(xmlDocument.toString());
                }
        }
       
}


вывод:

Код:

<root>
  <param1>1</param1>
  <param2>&lt;/blabla</param2>
  <param3>blabla]]&gt;</param3>
  <paramArray>
    <item>
      <id>1</id>
      <value>111</value>
    </item>
    <item>
      <id>2</id>
      <value>222</value>
    </item>
  </paramArray>
</root>



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

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