Cómo decodificar a Json usando JSON o actionjson nativos en Flex 3
actionscript-3 actionscript (4)
import com.adobe.serializers.json.JSONDecoder;
var JSON:JSONDecoder = new JSONDecoder();
var result:Object = JSON.decode(JSON_STRING);
eso funcionó para mí, entonces puedes construir nuevos tipos de objeto o valores de acceso jsut
result.template
o
result[''template'']
este último es bueno para valores / claves dinámicos necesarios en lugar de valores clave conocidos
Tengo el siguiente 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":"[email protected]",
"subject":"",
"message":""
},
"end":{
}
}
}
Como puede ver, hay 7 elementos (o subtítulos dentro del workflow
encabezado principal). Debajo de cada elemento puede tener otro conjunto de propiedades, por ejemplo: el correo electrónico (item)
tiene 3 propiedades ("name":"value")
.
Por lo tanto, según la cantidad de propiedades que necesito para poder crear controles (Text)
en mi IU de Flex 3.
Leí aquí que actionjson es 5-6 veces más rápido que as3corelib , pero no puedo encontrar ningún código de ejemplo para él. El documento actionjson dice que funciona de la misma manera que corelib, así que incluso intenté import com.adobe.serialization.json.JSON; JSON.decode(rawData)
import com.adobe.serialization.json.JSON; JSON.decode(rawData)
pero no puede encontrar JSON
.
A continuación está mi código
<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>
Ayúdame a buscar name, values
si los hay de cada artículo. Gracias
¿No es posible obtener datos json directamente de un objeto (no personalizado) como se hace en jquery ?
Actualizar con Flex Build Path
Si el analizador más rápido es lo que desea, querrá utilizar el análisis nativo de JSON. Su uso es tan simple como esto:
var result:Object = JSON.parse(event.result);
trace(result.workflow.template); //traces "Analysis1"
La clase JSON se encuentra en el paquete raíz, por lo que no es necesario importar nada. Puede encontrar información sobre su uso en los documentos .
Sin embargo, el JSON nativo solo está disponible para Flash Player 11 o superior, lo que significa que tendrá que apuntar al menos a esa versión de jugador. Desde su compilación de una aplicación Flex 3, se dirigirá a Flash Player 9 de manera predeterminada. Si sus requisitos no le prohíben apuntar al FP11 +, la solución más fácil es compilar con el SDK de Flex 4.6 (o superior). La captura de pantalla en su pregunta muestra que está utilizando Flex 3.5, por lo que tendrá que cambiar eso en la configuración de "compilación".
Si desea atravesar dinámicamente el objeto resultante, puede hacerlo con un simple bucle ''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]
//...
Si desea hacerlo recursivamente, puede verificar si un valor es un Objeto o no:
if (workflow[key] is Object) {
//parse that node too
}
else {
//just use the value
}
Después de seguir la solución de RIAstar, esto es lo que hice (compilador de Flex 3.5 y código de compilación de 4.6)
Compilador de Flex 3.5 que utiliza as3corelib.swc para 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":"[email protected]", "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));
}
}
salida
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
Compilador de Flex 4.6 utilizando el análisis nativo de 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":"[email protected]", "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));
}
}
salida
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
<?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
{"nombre": "dibneg", "edad": "67", "sexo": "femenino", "imagePath": "kamil.jpg"}