Använda JSON som datakälla i Flash PDF Skriv ut Skicka sidan
2011-06-10 08:32
json160JSON står för "JavaScript Object Notation" och kan med stor fördel användas som datakälla istället för XML.

Fördelarna med JSON kontra XML är att det är kompakt, lätt att navigera i och man får automatiskt rätt datatyp på enklare objekt som Boolean, Number, Object, Array och String.

JSON läses in som en lång sträng med hjälp av exempelvis URLLoader, strängen måste serialiseras för att kunna användas och det finns några olika tredjepartsbibliotek för detta. Fram till Flash Player 10.3 fanns det inte inbyggd, men det kommer att komma i en uppdatering av 10.3 lite längre fram då det funnits i inkubatorn sedan mitten av maj. Denna inbyggda parser är upp till tio gånger snabbare än vissa tredjepartsbibliotek, så Adobe har verkligen jobbat på att få till en bra inbyggd parser.

Det finns några olika valideringsverktyg på nätet, jag brukar använda "JSON Formatter & Validator" http://bit.ly/lZNSJj, som är riktigt bra och ger en tydlig bild på vad som är fel i datastrukturen.

Exempel

Jag har slängt ihop lite exempeldata för att jämföra JSON och XML. Här visas det tydligt på hur kompakt JSON data är jämfört med XML. Jag har använt olika datatyper för att visa hur enkelt det är att typa objekt redan i JSON datan.

JSON
[
      {
           "name" : "Patric Jonsson",
           "ocupation" : "Flash platform developer",
           "workstations" : ["HP Z400", "MSI Windtop AE2220-274US", "HP G62-b30EO"],
           "mobiledevices" : ["iPad", "iPhone 3G", "iPhone 4", "Nexus One", "Samsung Galaxy Tab"],
           "tools" : [
                {
                     "manefacturer" : "Adobe",
                     "applications" : ["Adobe CS 5.5 Master Collection"]
                },
                {
                     "manefacturer" : "Powerflasher",
                     "applications" : ["FDT 4"]
                },
                {
                     "manefacturer" : "Flashdevelop",
                     "applications" : ["FlashDevelop 3.3.4", "FlashDevelop 4 Beta"]
                }
           ],
           "age" : 34,
           "length" : 182.5,
           "isLeftHanded" : false
      },
      {
           "name" : "Mikael Palm",
           "ocupation" : "Flash platform developer",
           "workstations" : ["Apple MacBook Pro"],
           "mobiledevices" : ["iPad", "iPhone 4", "Nexus One", "BlackBerry PlayBook"],
           "tools" : [
                {
                     "manefacturer" : "Adobe",
                     "applications" : ["Adobe CS 5.5 Master Collection"]
                },
                {
                     "manefacturer" : "Powerflasher",
                     "applications" : ["FDT 4"]
                }
           ],
           "age" : 33,
           "length" : 176,
           "isLeftHanded" : true
      }
 ]

XML

<developers>
     <developer>
          <name>Patric Jonsson</name>
          <ocupation>Flash platform devloper</ocupation>
          <workstations>
               <workstation>HP Z400</workstation>
               <workstation>MSI Windtop AE2220-274US</workstation>
               <workstation>HP G62-b30EO</workstation>
          </workstations>
          <mobiledevices>
               <mobiledevice>iPad</mobiledevice>
               <mobiledevice>iPhone 3G</mobiledevice>
               <mobiledevice>iPhone 4</mobiledevice>
               <mobiledevice>Nexus One</mobiledevice>
               <mobiledevice>Samsung Galaxy Tab</mobiledevice>
          </mobiledevices>
          <tools>
               <applications manefacturer="Adobe">
                    <application>Adobe CS 5.5 Master Collection</application>
               </applications>
               <applications manefacturer="Powerflasher">
                    <application>FDT 4</application>
               </applications>
               <applications manefacturer="FlashDevelop">
                    <application>FlashDevelop 3.3.4</application>
                    <application>FlashDevelop 4</application>
               </applications>
          </tools>
          <age>34</age>
          <length>182.5</length>
          <islefthanded>false</islefthanded>
     </developer>
     <developer>
          <name>Mikael Palm</name>
          <ocupation>Flash platform devloper</ocupation>
          <workstations>
               <workstation>Apple MacBook Pro</workstation>
          </workstations>
          <mobiledevices>
               <mobiledevice>iPad</mobiledevice>
               <mobiledevice>iPhone 4</mobiledevice>
               <mobiledevice>Nexus One</mobiledevice>
               <mobiledevice>BlackBerry PlayBook</mobiledevice>
          </mobiledevices>
          <tools>
               <applications manefacturer="Adobe">
                    <application>Adobe CS 5.5 Master Collection</application>
               </applications>
               <applications manefacturer="Powerflasher">
                    <application>FDT 4</application>
               </applications>
          </tools>
          <age>33</age>
          <length>176</length>
          <islefthanded>true</islefthanded>
     </developer>
</developers>

Jobba med JSON

För att jobba med JSON behöver man alltså något som serialiserar datan och för tillfället finns det alltså bara tredjepartsbibliotek. Jag har använt mig av den slöa as3corelib skriven av Mike Chambers (http://bit.ly/kRu9XM), det finns alltså andra som är snabbare om det är av vikt.

Först måste vi läsa in datafilen som jag har döpt till data.json och som ligger i samma nivå som min swf:

var tLoader:URLLoader = new URLLoader();
tLoader.load( new URLRequest( "data.json" ) );
tLoader.addEventListener( Event.COMPLETE, onJSONLoadComplete );

Längst ner i denna post kan du se hur objekten är typade i klasserna.

private function onJSONLoadComplete( e:Event ):void
 {
      var tDeveloper:Developer;
      var tTools:Vector.<Tool>;
      var tTool:Tool;
      var tData:Array = JSON.decode( e.currentTarget.data );
      for each ( var tJsonDeveloper:Object in tData )
      {
           tDeveloper = new Developer();
           tDeveloper.name = tJsonDeveloper.name;
           tDeveloper.ocupation = tJsonDeveloper.ocupation;
           tDeveloper.workstations = tJsonDeveloper.workstations;
           tDeveloper.mobiledevices = tJsonDeveloper.mobiledevices;
           tTools = new Vector.<Tool>();
           for each( var tJsonTool:Object in tJsonDeveloper.tools )
           {
                tTool = new Tool();
                tTool.manefacturer = tJsonTool.manefacturer;
                tTool.applications = tJsonTool.applications;
                tTools.push(tTool);
           }
           tDeveloper.tools = tTools;
           tDeveloper.age = tJsonDeveloper.age;
           tDeveloper.length = tJsonDeveloper.length;
           tDeveloper.isLeftHanded = tJsonDeveloper.isLeftHanded;
      }
 }

Dataobjekten är nu klara att användas:

jsonparsing

Länkar till bra källor om JSON

JSON hemsidahttp://bit.ly/ltQ54I
Wikipediahttp://bit.ly/lP1E4r
TheFlashBlog, Angry Natvie JSON Parsing in Flash: http://bit.ly/mm9fXi
Bytearray, Thibault Imbert bloggar om nya funktioner i Flash Player 10.3, http://bit.ly/iy6E8S

[English resume]
JSON is an acronym for "JavaScript Object Notation" and can with great advantages be used as data source instead of XML in flash based applications.

The advantages over XML isthat JSON is compact, human readable and automaticly gives you the correct datatype for the basic datatypes, Boolean, Number, Object, Array and String.

JSON is read into Flash Player as a long string with help of, say, URLLoader and the data must be serialized to be used. In Flash Player 10.3 there is no native support for JSON but there are some different third party libs that can be used for serialization. Native support for JSON will be released soon as it has been implemented in the incubator builds since mid May.

As for validation, I use the "JSON Formatter & Validator" http://bit.ly/lZNSJj, which really comes in handy when writing JSON data and gives a good overview of errors in the data structure.

Take a look at the above examples to learn how JSON can be used in Flash.


 

Klasser jag använt i mitt exempel

Developer klass (inte best practice att använda publika variabler, men för att denna post inte ska bli överdrivet lång har jag valt att använda det här):

package 
 {
      public class Developer
      {
           public var name:String = null;
           public var ocupation:String = null;
           public var workstations:Array = null;
           public var mobiledevices:Array = null;
           public var tools:Vector.<Tool> = null;
           public var age:int = 0;
           public var length:Number = 0;
           public var isLeftHanded:Boolean = false;
          
           public function Developer() {}
      }
 }

Tool klass:

package 
 {
      public class Tool
      {
           public var manefacturer:String = null;
           public var applications:Array = null;
          
           public function Tool() {}
      }
 }


Bedöm artikeln:
( 1 Bedömning )
Skapad 2011-06-10 08:32 av Patric Jonsson

Visad 660 gånger än så länge.

Senaste artiklarna av Patric Jonsson


Senast uppdaterad 2011-06-27 19:33

Lägg till kommentar


Medlemmar


Members Online: 0

Senaste registrerade

LisaRaichand : 22 april 2012 19:55pilu : 31 januari 2012 09:58Gostship99 : 07 januari 2012 19:37Director : 18 november 2011 05:44Dahlback : 17 november 2011 16:28mikwonwheels : 14 november 2011 13:20Kviddis : 04 oktober 2011 19:53buddha1966 : 25 september 2011 14:22idesign : 20 september 2011 08:45TxT : 05 september 2011 11:07ApelG : 05 september 2011 11:04
Partners
Adobe user group
fdt5-logo
TechSmith
Lynda user group
Apress user group
O´reilly user group
Peachpit user group
Friends Of Ed
Manning user group


Senaste blogginläggen

Av: Danel
-20.02.2012
Av: Patric Jonsson
-27.01.2012
Av: Patric Jonsson
- 3.01.2012
Av: Patric Jonsson
-29.11.2011
Av: Danel
-26.11.2011
Av: Patric Jonsson
-14.11.2011
Av: Patric Jonsson
- 8.11.2011
Av: Danel
- 7.11.2011
Av: Patric Jonsson
-27.09.2011

Senaste kommentarer

Senaste trådarna

Av Hallon
- 08/05/2012
Av goldensebbe
- 06/04/2012
Av Hallon
- 29/03/2012
Av buddha1966
- 06/03/2012
Av buddha1966
- 29/02/2012
Av Wide Circle
- 20/02/2012
Av zocstyle
- 15/02/2012
Av ufoalf30
- 05/01/2012
Av peterdavidsson
- 08/12/2011
Av JohnPaulie
- 03/12/2011
Av coffaldo
- 17/11/2011
Av buddha1966
- 05/11/2011
Av buddha1966
- 03/11/2011

Blogkalender

  • 2012 (3)
  • 2011 (37)
  • 2010 (85)
  • 2009 (18)
  • Vem är online

    Vi har 31 besökare online
    RSS
    Patric Jonsson - flashguru.se
    RocketTheme Joomla Templates