Как декодировать Json, используя нативный JSON или actionjson во Flex 3 - PullRequest
4 голосов
/ 12 марта 2012

у меня ниже Json (wf.json)

{
"workflow":{
    "template":"Analysis1",

    "start":{
        "instance":"HDA_run1",
        "user":"symtest",
        "date":"3-Mar-2012",
        "timestamp":"1330948220475"
    },
    "host":{
        "name":"bartla",
        "user":"symtest1",
        "password":"symtest1",
        "installpath":"",
        "product":""
    },
    "javadump":{
        "pid":"8989",
        "corefilename":"",
        "heapdump":"",
        "stack":"",
        "JAVA_HOME":""  
    },
    "mat":{
    },
    "email":{
        "to":"ars@gmail.com",
        "subject":"",
        "message":""
    },
    "end":{
    }
}
}

Как вы можете видеть, есть 7 пунктов (или подзаголовки внутри основного заголовка workflow). Под каждым элементом он может иметь другой набор свойств, например: email (item) имеет 3 свойства ("name":"value").

Таким образом, исходя из количества свойств, мне нужно иметь возможность создавать элементы управления (Text) в моем интерфейсе Flex 3.

Я прочитал здесь , что actionjson в 5-6 раз быстрее, чем as3corelib , но я не могу найти пример кода для него. Документ actionjson говорит, что он работает так же, как corelib, поэтому я даже попытался import com.adobe.serialization.json.JSON; JSON.decode(rawData), но он не может найти JSON.

Ниже мой код

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
            layout="absolute" minWidth="955" minHeight="600"
            creationComplete="service.send()">

    <mx:Script>
    <![CDATA[

        import mx.controls.Alert;
        import mx.rpc.events.ResultEvent;

        private function onJSONLoad(event:ResultEvent):void
        {
            //get the raw JSON data and cast to String
            var rawData:String = String(event.result);
            //Alert.show(rawData); This prints my JSON String

            var obj:Object = decodeJson(rawData);   
            /*error call to possibly undefined method decodeJson*/
            Alert.show(obj.toString());
        }
    ]]>
    </mx:Script>

    <mx:HTTPService id="service" resultFormat="text"
                url="/cjb/wf.json"
                result="onJSONLoad(event)" />

</mx:Application>

Пожалуйста, помогите мне получить name, values, если таковые имеются от каждого элемента. Спасибо

Разве невозможно напрямую получать данные json из объекта (не сделанного на заказ), как это делается в jquery ?

Обновление с помощью Flex Build Path

enter image description here

Ответы [ 4 ]

10 голосов
/ 14 марта 2012

Если вам нужен самый быстрый парсер, то вы захотите использовать собственный JSON-разбор.Его использование так просто:

var result:Object = JSON.parse(event.result);
trace(result.workflow.template);  //traces "Analysis1"

Класс JSON находится в корневом пакете, поэтому не нужно ничего импортировать.Вы можете найти информацию о его использовании в документах .

. Однако собственный JSON доступен только для Flash Player 11 или более поздней версии, что означает, что вам придется ориентироваться как минимум на эту версию проигрывателя.После компиляции приложения Flex 3 оно будет по умолчанию предназначено для Flash Player 9.Если ваши требования не запрещают вам ориентироваться на FP11 +, самое простое решение - это скомпилировать с помощью Flex 4.6 (или выше) SDK.Снимок экрана в вашем вопросе показывает, что вы используете Flex 3.5, поэтому вам придется изменить это в настройках «пути сборки».


Если вы хотите динамически обойти полученный объект, выможет сделать это с помощью простого цикла for:

//workflow is the root node of your structure
var workflow:Object = result.workflow;
//iterate the keys in the 'workflow' object
for (var key:String in workflow) {
    trace(key + ': ' + workflow[key]);
}
//template: Analysis1
//start: [Object]
//host: [Object]
//...

Если вы хотите сделать это рекурсивно, вы можете проверить, является ли значение Object или нет:

if (workflow[key] is Object) {
    //parse that node too
}
else {
    //just use the value
}
2 голосов
/ 21 декабря 2012
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
    <![CDATA[
        import com.adobe.serialization.json.JSON;       
        [Embed(source="assets/test.json",mimeType="application/octet-stream")]
        private var json_file:Class;
        protected function button1_clickHandler(event:MouseEvent):void
        {           
            trace("Hello from Flex Debugging!");
            var bytes:ByteArray = new json_file();
            var json:String = bytes.readUTFBytes(bytes.length);
            trace(json);            
            var arr:Object = JSON.decode(json);
            for (var keyname:String in arr)
            {
                trace ( keyname + ": " + arr[ keyname ] );          
            }   
            grid.dataProvider = arr;
        }
    ]]>
</mx:Script>
<mx:DataGrid id="grid" right="10" left="10" top="10" bottom="10">
        <mx:columns>
            <mx:DataGridColumn headerText="Name" dataField="name"/>
            <mx:DataGridColumn headerText="Age" dataField="age"/>
        </mx:columns>
    </mx:DataGrid>
    <mx:Button x="538" y="45" label="Get Json" click="button1_clickHandler(event)"/>
</mx:WindowedApplication>

test.json

{ "имя": "дибнег", "возраст": "67", "секс": "женщина", "imagePath": "kamil.jpg" }

1 голос
/ 15 марта 2012

После того, как я принял решение от RIAstar, именно это я и сделал (и компилятор Flex 3.5, и код компилятора 4.6)

Компилятор Flex 3.5, использующий as3corelib.swc для JSON

import com.adobe.serialization.json.JSON;

private var temp:String ='{"workflow":{ "template":"HeapDumpAnalysis",      "start":{       "instance":"HDA_run1",      "user":"symtest",       "date":"3-Mar-2012",        "timestamp":"1330948220475" },  "host":{        "name":"estilo",        "user":"symtest1",      "password":"symtest1",      "installpath":"",       "product":""    },  "javadump":{        "pid":"8989",       "corefilename":"",      "heapdump":"",      "stack":"",     "INFA_HOME":""  },  "mat":{ },  "email":{       "to":"vsatwik@informatica.com",     "subject":"",       "message":""    },  "end":{ }}}';
private function test():void
{
    var obj = JSON.decode(temp);

    var workflow:Object = obj.workflow;
    for (var key:String in workflow) {
        trace(key + ': ' + workflow[key] + (key is String) + ", " + (workflow[key] is String));

    }
}

output

javadump: [object Object]true, false
template: HeapDumpAnalysistrue, true
host: [object Object]true, false
end: [object Object]true, false
mat: [object Object]true, false
email: [object Object]true, false
start: [object Object]true, false

Компилятор Flex 4.6 с использованием собственного анализа Json

private var temp:String ='{"workflow":{ "template":"HeapDumpAnalysis",      "start":{       "instance":"HDA_run1",      "user":"symtest",       "date":"3-Mar-2012",        "timestamp":"1330948220475" },  "host":{        "name":"estilo",        "user":"symtest1",      "password":"symtest1",      "installpath":"",       "product":""    },  "javadump":{        "pid":"8989",       "corefilename":"",      "heapdump":"",      "stack":"",     "INFA_HOME":""  },  "mat":{ },  "email":{       "to":"ars@gmail.com",       "subject":"",       "message":""    },  "end":{ }}}';

private function test():void
{
    var result:Object = JSON.parse(temp);
    var workflow:Object = result.workflow;

    for (var key:String in workflow) {
        trace(key + ': ' + workflow[key] + (key is String) + ", " + (workflow[key] is String));

    }
}

output

javadump: [object Object]true, false
mat: [object Object]true, false
end: [object Object]true, false
email: [object Object]true, false
host: [object Object]true, false
start: [object Object]true, false
template: HeapDumpAnalysistrue, true
0 голосов
/ 12 марта 2012
import com.adobe.serializers.json.JSONDecoder;

var JSON:JSONDecoder = new JSONDecoder();
var result:Object = JSON.decode(JSON_STRING);

, который работал для меня, тогда вы можете либо создать новый тип (ы) объектов или значения доступа jsut, либо

result.template

, либо

result['template']

, последний подходит длянужны динамические значения / ключи, а не известные значения ключей

...