2

オブジェクトの配列(ネストされた)をJSON文字列に変換しようとしています。これが私の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>

これは、オブジェクト配列をJSONに変換するための私のASコードです

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文字列をレンダリングする理由はありますか?

私がはっきりしていることを願っています。ありがとう。

4

2 に答える 2

7

おそらく、AS3オブジェクトからJSON文字列に変換する最も簡単な方法は、as3corelibのJSONクラスを使用することです。

使用例:

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

as3corelib JSONパーサーはかなり長い間多くの人々によって開発され、使用されてきたため、独自のパーサーを作成しないことをお勧めします。

編集: @dpcaoは、外部ライブラリももう必要ないと述べました。AdobeはFlashPlayer11で利用可能な新しいJSONクラスを導入しました。

使用例:

var jsonString:String = JSON.stringify(myDataObject);
于 2012-10-14T21:31:43.487 に答える
0

ネイティブ オブジェクトを反復処理していますか? それとも XML オブジェクトを介してですか? [XMLList][1] を反復する場合は、length ではなく length() を使用する必要があるためです (名前のコレクションを避けるために関数として名前を付けました)。

しかし、正直なところ、JSONLib を使用するか、[ネイティブに][2]、Flash Player 10.3 以降でネイティブに使用してください。JSON.parse と JSON.stringify をそれぞれ使用して、javascript API を模倣します。これは JSON シリアライゼーションの問題ではありません。シリアライゼーションのサーバー側またはクライアント側にバグがある可能性があります。各オブジェクトに serialize() 関数を追加することをお勧めします。これにより、長期的には保守が容易になります。すなわち:

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

これにより、個々のオブジェクトをデバッグして問題の原因を確認することが容易になります。ご覧のとおり、コードが機能しない理由はありません。ただし、actionscript シリアライゼーション クラスに問題があり、変数ノードを追加しない場合があります。つまり、{ "name": value } ではなく [] をシリアライズします。ネイティブ シリアライザーを試して、何が起こるかを確認してください。(-swf-version=16 を忘れないでください)

于 2012-10-15T05:25:16.557 に答える