2012-10-14 61 views
2

我想将对象数组(嵌套)转换为JSON字符串。 这里是我的JSON输出:AS3对象到JSON

[{ 
    "Width": 570, 
    "SessionID": 2003404006158805, 
    "Price": "69,90", 
    "PageCount": 24, 
    "Pages": [{ 
     "ID": 1, 
     "TemplateID": 0, 
     "PageType": "cover", 
     "TextContainers": [], 
     "ImageContainers": [] 
    }, { 
     "ID": 2, 
     "TemplateID": 1001, 
     "PageType": "single", 
     "TextContainers": [], 
     "ImageContainers": [] 
    }, { 
     "ID": 3, 
     "TemplateID": 0, 
     "PageType": "double", 
     "TextContainers": [], 
     "ImageContainers": [{ 
      "Width": 570, 
      "IsBG": true, 
      "Brightness": 0, 
      "Contrast": 0, 
      "PosX": null, 
      "ScaleX": null, 
      "Height": 284, 
      "ID": -1, 
      "BlackWhite": 0, 
      "PosY": null, 
      "HasPhoto": false, 
      "ScaleY": null, 
      "PhotoID": null 
     }] 
    }, { 
     "ID": 4, 
     "TemplateID": 0, 
     "PageType": "double", 
     "TextContainers": [], 
     "ImageContainers": [{ 
      "Width": 570, 
      "IsBG": true, 
      "Brightness": 0, 
      "Contrast": 0, 
      "PosX": null, 
      "ScaleX": null, 
      "Height": 284, 
      "ID": -1, 
      "BlackWhite": 0, 
      "PosY": null, 
      "HasPhoto": false, 
      "ScaleY": null, 
      "PhotoID": null 
     }] 
    }], 
    "ProductSubID": 0, 
    "Height": 620, 
    "ProductID": 0 
}] 

而当我想这个字符串转换成XML(在服务器端)出来这样的:

<?xml version="1.0" encoding="UTF-8" ?> 
    <0> 
     <Width>570</Width> 
     <SessionID>2003404006158805</SessionID> 
     <Price>69,90</Price> 
     <PageCount>24</PageCount> 
     <Pages> 
      <ID>1</ID> 
      <TemplateID>0</TemplateID> 
      <PageType>cover</PageType> 
     </Pages> 
     <Pages> 
      <ID>2</ID> 
      <TemplateID>1001</TemplateID> 
      <PageType>single</PageType> 
     </Pages> 
     <Pages> 
      <ID>3</ID> 
      <TemplateID>0</TemplateID> 
      <PageType>double</PageType> 
      <ImageContainers> 
       <Width>570</Width> 
       <IsBG>true</IsBG> 
       <Brightness>0</Brightness> 
       <Contrast>0</Contrast> 
       <PosX /> 
       <ScaleX /> 
       <Height>284</Height> 
       <ID>-1</ID> 
       <BlackWhite>0</BlackWhite> 
       <PosY /> 
       <HasPhoto>false</HasPhoto> 
       <ScaleY /> 
       <PhotoID /> 
      </ImageContainers> 
     </Pages> 
     <Pages> 
      <ID>4</ID> 
      <TemplateID>0</TemplateID> 
      <PageType>double</PageType> 
      <ImageContainers> 
       <Width>570</Width> 
       <IsBG>true</IsBG> 
       <Brightness>0</Brightness> 
       <Contrast>0</Contrast> 
       <PosX /> 
       <ScaleX /> 
       <Height>284</Height> 
       <ID>-1</ID> 
       <BlackWhite>0</BlackWhite> 
       <PosY /> 
       <HasPhoto>false</HasPhoto> 
       <ScaleY /> 
       <PhotoID /> 
      </ImageContainers> 
     </Pages> 
     <ProductSubID>0</ProductSubID> 
     <Height>620</Height> 
     <ProductID>0</ProductID> 
    </0> 

但我需要它像:

<pages> 
<page> 
</page> 
<page> 
</page> 
</pages> 

这是我的AS代码,对象数组转换成JSON

var Pages:Array = []; 
      var Books:Array = []; 
      var JBook:Object = new Object(); 

      JBook.Width = Global.BOOK_WIDTH; 

      for(var i:Number = 0; i<Global.PAGES.length; i++) 
      { 
       var Page:PageVO = Global.PAGES[i] as PageVO; 
       var JPage:Object = new Object(); 
       JPage.ID = Page.ID; 

       var ImageContainers:Array = []; 
       var TextContainers:Array = []; 
       var Template:TemplateVO = Page.ACTIVE_TEMPLATE; 

       for(var j:Number = 0; j<Template.IMAGE_CONTAINERS.length; j++) 
       { 
        var ImageContainer:ImageContainerVO = Template.IMAGE_CONTAINERS[j] as ImageContainerVO; 
        var JImageContainer:Object = new Object(); 
        JImageContainer.ID = ImageContainer.ID; 
        ImageContainers.push(JImageContainer); 
       } 

       for (var m:Number = 0; m<Template.TEXT_CONTAINERS.length; m++) 
       { 
        var TextContainer:TextContainerVO = Template.TEXT_CONTAINERS[m] as TextContainerVO; 
        var JTextContainer:Object = new Object(); 
        JTextContainer.ID = TextContainer.ID; 
       } 

       JPage.TextContainers = TextContainers; 
       JPage.ImageContainers = ImageContainers; 
       Pages.push(JPage); 
      } 

      var Photos:Array = []; 
      for(var p:Number = 0; p<Global.PHOTOS.length; p++) 
      { 
       var Photo:PhotoVO = Global.PHOTOS[p] as PhotoVO; 
       var JPhoto:Object = new Object(); 
       JPhoto.BMP = ImageUtils.BitmapToBase64(Photo.BMP.bitmapData); 
       JPhoto.UseCount = Photo.USE_COUNT; 
       JPhoto.ID = Photo.ID; 
       Photos.push(JPhoto); 
      } 


      //JBook.Photos = Photos; 
      JBook.Pages = Pages; 
     JSON = com.adobe.serialization.json.JSON.encode(Books); 

任何想法为什么它呈现JSON字符串,就像它们不在同一个节点中(每个页面项目都是单独的节点)?

希望我已经清楚。谢谢。

+1

你为什么不制作你想要的xml? ActionScript 3具有相当健壮的['XML'实现](http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/XML.html)。但除此之外,JSON结构看起来像:'pages:{page:[]}'可能会起作用。 –

回答

6

将AS3对象转换为JSON字符串的最简单方法可能是使用JSON class from as3corelib

用法示例:

var jsonString:String = JSON.encode(myDataObject); 

这可能是最好不要写自己的解析器,为的as3corelib JSON解析器已制定并使用许多人来说,很长一段时间。

编辑: @dpcao在flash播放11.提到,你甚至不需要外部库了,Adobe introduced a new JSON class可用

用法示例:

var jsonString:String = JSON.stringify(myDataObject); 
+1

同意,不需要<插入令人讨厌的关于车轮的滥用声明>。 – Marty

0

您通过本机对象迭代?或通过一个XML对象?因为如果你是一个迭代[返回XMLList] [1]你应该使用长度(),不长(他们将其命名为一个功能,以避免名称集合)

不过说实话,用JSONLib,或[本地] [2 ],使用Flash Player 10.3或更高版本,本地使用它。它模仿JavaScript api,分别使用JSON.parse和JSON.stringify。这不应该是JSON序列化的问题,您可能在序列化时出现服务器端或客户端的错误。我会建议为每个对象添加一个serialize()函数 - 这使得从长远来看它更容易维护。即:

class PageVO { 
    function serialize():Object { 
    return { 
     ID: some_id, 
     Template_ID: some_template_id, 
     // add image containers here 
    } 
    } 
} 

这将更容易调试单个对象,以查看问题来自何处。看起来,没有理由为什么你的代码不应该工作。但是,actionscript序列化类可能存在问题,并且不会添加变量节点:即serializing [],而不是{“name”:value}。尝试本机串行器,看看会发生什么。 (别忘了-swf-version = 16)