2012-10-14 62 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)