如何加载JSON数据并将其用作dataGroup的dataProvider?

时间:2013-04-06 03:29:57

标签: actionscript-3 flex flash-builder

我正在尝试如何在flex 4.6中创建自定义项呈示器并拥有一个JSON格式的数据源...我使用以下方法检索json数据并且它可以工作,我可以正常访问数据

myJSONdata[i].id
myJSONdata[i].username   etc...

但是在理解如何将这些数据作为flex期望的数据类型(ArrayList,ArrayCollection?)用于分配给dataGroup的dataProvider时遇到了问题。

public var loader:URLLoader = new URLLoader();
public var jsonContent:URLLoader;
public var myJSONdata:Object;
public var request:URLRequest;

public function Init():void {

request = new URLRequest("URL TO THE JSON DATA...");
loader.load(request);
loader.addEventListener(Event.COMPLETE, jsonLoaded);
}


public function jsonLoaded(event:Event):void {

jsonContent = URLLoader(event.target);      
myJSONdata = JSON.parse(jsonContent.data);  

trace(myJSONdata.length);               

}

当我尝试像这样分配dataProvider时......

<s:DataGroup dataProvider="myJSONdata">

我收到此错误:

Initializer for 'dataProvider': values of type mx.collections.IList cannot be represented in text.

我想使用相同的数据访问功能,然后将该数据用作一个数组,然后我可以将其用作dataGroup的dataProvider。

2 个答案:

答案 0 :(得分:1)

给出你的DataGroup和id,并在AS3中分配dataProvider,如下所示:

<s:DataGroup id="myDataGroup">

//in as3

myDataGroup.dataProvider = new ArrayCollection(myJSONdata);

或者您可以像在MXML中那样分配它,但是必须将变量名称包装在花括号中。

<s:DataGroup dataProvider="{myJSONdata}">

您收到该错误的原因是因为MXML将myJSONdata视为普通字符串。

您可能仍需要将JSON数组放在ArrayCollection中,就像我在第一个示例中所做的那样。

希望有所帮助。

答案 1 :(得分:0)

虽然这篇文章很老但是这可能仍然有用,也许对其他人来说。

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
    <s:HTTPService id="jsonLoader" result="jsonLoader_resultHandler(event)"
                   url="http://example.com/sample.json" />
</fx:Declarations>
<fx:Script>
    <![CDATA[
        import com.adobe.serializers.json.JSONDecoder;

        import mx.collections.ArrayCollection;
        import mx.rpc.events.ResultEvent;

        //<s:WindowedApplication .... creationComplete="initApp()">
        public function initApp():void
        {
            //so trigger jsonLoader to load the json data from the link
            // using the HTTPService immediately the application starts;
            jsonLoader.send();
        }

        protected function jsonLoader_resultHandler(event:ResultEvent):void
        {
            var jsonContent:Object = (new JSONDecoder()).decode(event.result.toString());
            //Assuming jsonContent.data is an Array
            resultDataGrid.dataProvider = new ArrayCollection(jsonContent.data);
        }
    ]]>
</fx:Script>