<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Flex Json文檔

    JSON(JavaScript Object Notation)是一個很受歡迎的代替以XML的數(shù)據(jù)格式傳輸?shù)?/span>Web瀏覽器的數(shù)據(jù)交換格式。 flexjson是一個輕量級的library用來序列化Java對象到JSON的。有什么不同flexjson是它的控制哪些得到系列化,讓雙方深與淺拷貝的對象。大多數(shù)JSON的序列化模仿對象序列化library,并設(shè)法序列化整個對象圖,變成JSON的數(shù)據(jù)交換格式。這個問題的成因是當(dāng)您想要一個被連接的對象模型在您的服務(wù)器里, 但您不能寄發(fā)那個對象模型到客戶因為序列化library將設(shè)法送整個對象圖。這使它很難針對模型創(chuàng)造對象和序列化那個模型片斷對客戶不需寄送一切。其他JSONlibrary,你必須創(chuàng)造大量的樣板文件代碼你把你的對象轉(zhuǎn)換成JSON的對象。在這方面,我不應(yīng)該來解釋一下,要盡量簡短,但我只想說,我最討厭樣板文件轉(zhuǎn)換代碼! flexjson試圖解決上述兩個問題提供了更高層次的API,我敢說的DSL指明你的意圖。為了探索flexjson我們將使用以下的數(shù)據(jù)模式。讓我們說說正在建設(shè)的PIM或聯(lián)絡(luò)管理應(yīng)用。這里有幾個class,我們可以看到它們之間的關(guān)系。

    人、地址、郵政編碼和電話類UML圖。

    在上述圖表,你可以看到Person中可以有很多的Phone和很多的Address。雖然這是個簡單對象模型,這將有助于我們示范flexjson的用法。

    The Basics

    flexjson采取了不同的做法,讓你方便地控制序列化的深度。它與hibernate有個十分相似的概念延遲加載,允許你有一個連接對象模型,但控制哪些對象被加載了是在你的數(shù)據(jù)庫之外執(zhí)行。讓我們來看一個簡單的例子,讓你感覺一下flexjson library如何工程。我們序列化一個Person的實例。我們不妨做到以下幾點:

    public String doSomething( Object arg1, ... ) {

            Person p = ...load a person...;

            JSONSerializer serializer = new JSONSerializer();

            return serializer.serialize( p );

        }

       

    上述代碼將會產(chǎn)生下列輸出:

    {

            "class": "Person",

            "name": "William Shakespeare",

            "birthday": -12802392000000,

            "nickname": "Bill"

    }

    Working With Includes

    看起來幾乎像你所期待的。然而我們的Person對象包含了更多的屬性比如姓名,生日,昵稱,還有電話號碼和地址?默認(rèn)情況下flexjson序列化對象的直接屬性。這只是一個淺層的代表對象。所有容器類都是沒有系列化。或者說,一對多的關(guān)系和多對多的關(guān)系并沒有序列化。是指對象引用系列化。還有多對一的關(guān)系和一對一的關(guān)系將被序列化。這一點與其他的library一樣,像HibernateJPA默認(rèn)是熱切加載。但是我們希望包括phonenumbers屬性,然后我們可以做到以下幾點:

    public String doSomething( Object arg1, ... ) {

            Person p = ...load a person...;

            return new JSONSerializer().include("phoneNumbers").serialize(p);

    }

    在這個例子中,我們將告訴序列化器對象包括的屬性。容器類的系列化是淺層復(fù)制包括的對象內(nèi)容。所以在我們的例子中,Person有個List類型的屬性叫phonenumbers List類中包含Phong實例。這意味著flexjson將淺拷貝的Person,名單phonenumbers ,淺拷貝的每一個電話,例如內(nèi)部的名單上。所以輸出可能看起來是這樣的:

    {

            "class": "Person",

            "name": "William Shakespeare",

            "birthday": -12802392000000,

            "nickname": "Bill"

            "phoneNumbers": [

                {

                    "class": "Phone",

                    "name": "cell",

                    "number": "555-123-4567"

                },

                {

                    "class": "Phone",

                    "name": "home",

                    "number": "555-987-6543"

                },

                {

                    "class": "Phone",

                    "name": "work",

                    "number": "555-678-3542"

                }

           ]

    }

    熟悉這個用法了?這實在是太簡單。如果你想包含phonenumbersaddress,你可以執(zhí)行兩次include方法,或者你可以包括兩個參數(shù),include方法使用了Java的新語法功能。我個人較喜歡因為我認(rèn)為這將令程序短小且易于閱讀。但是,那是你自己的選擇。

        public String doSomething( Object arg1, ... ) {

            Person p = ...load a person...;

            return new JSONSerializer().include("phoneNumbers", "addresses").serialize(p);

        }

    所以在這種情況下,我們將只能獲得一個街,市,州,但不是郵政編碼,因為這是一個對象引用。它采用一種簡單的固定小點記法。這里是一個例子,包括郵編每個地址舉例。

        public String doSomething( Object arg1, ... ) {

            Person p = ...load a person...;

            return new JSONSerializer().include("phoneNumbers", "addresses.zipcode").serialize(p);

    }

     

    Flexjson 是足夠聰明的知道你想要對象本身包含collection容器類和不包含collection容器類。它也足夠聰明的知道地址引用也包括郵編,讓您不用指定兩次。你可以非常容易的使用點符號追尋你的對象圖。

    More on Includes

    有一個候補的serialize )方法允許您指定一個外部對象集合。也有一些JavaScriptlibraryEXTJS(previously known as YUI-EXT)要求這為他們的JSON 數(shù)據(jù)模型。不過,我并沒有發(fā)現(xiàn)有任何JSONlibrary提供這種類型的系列化。下面是一個例子:

        public String getPeople( Object arg1, ... ) {

            List people = ...load a person...;

            return new JSONSerializer().include("phoneNumbers").serialize("people", people);

        }

     

    上述代碼將會產(chǎn)生下列輸出:

    {

            "people" : [

                {

                    "class": "Person",

                    "name": "Warren Buffet",

                    "birthday": -1241467200000,

                    "nickname": "Oracle of Omaha",

                    "phonNumbers" : [ ... ],

                },

                {

                    "class": "Person",

                    "name": "Steven Jobs",

                    "birthday": -468702000000,

                    "nickname": "Steve",

                    "phonNumbers" : [ ... ],

                }

            ]

        }

    Working With Excludes

    您不只可以包括,你還可以指定某些屬性來排除它。exclude )方法可以讓你在序列化時排除某些屬性。如果你有特殊的屬性,你不想要發(fā)送到客戶端像密碼,或保密的數(shù)據(jù),應(yīng)該留在服務(wù)器上,這個功能就派上用場。

    public String doSomething( Object arg1, ... ) {

            User u = ...load a user...;

            return new JSONSerializer().exclude("password").include("hobbies").serialize(p);

        }

    使用點“.”時exludesincludes使用上有一個微妙的差異。如果你排除嵌套屬性,就意味著其余的父對象也包括在內(nèi)。如果執(zhí)行exclude("head.rightEye.retinalScan")rightEye屬性的retinalScan成員將被排除,但是rightEye和主要的屬性將包括在內(nèi)。原因是為了排除retinalScan屬性,你必須包括rightEye成員。如果你沒有的話,并不會改變?nèi)魏螙|西,因為retinalScan本來并不打算列入擺在首位。另一種說法,它是唯一排斥的最后一個屬性其他父屬性均包括在內(nèi)。

    Excluding Using Annotations

    總是用這種方式做排除是很累贅的,尤其是如果你總是想要做某事被排除或包括。 flexjson提供了一種注解(Annotations)方法來表達。JSON注解(Annotations)可以使用標(biāo)記包括一個對象的屬性。注解(Annotations)可能被安置在方法或領(lǐng)域。。一個 很好的例子,Address的對象包含一個引用的Zipcode對象。因為郵政編碼是每個地址的整體部分(在美國),這里我們使用注解(Annotations)方法來表達。因此,在我們的Address對象,我們可以做到以下幾點:

     

    public class Address {

           private String name;

           private String street;

           private String city;

           private String state;

           private Zipcode zipcode;

           @JSON

           public Zipcode getZipcode() {

           }

        }

    注解(Annotations可提高安全性。采用這種方法,您讓您的代碼更DRY,并防止意外的安全漏洞。考慮如果我們存放密碼的一個hashed 版本在我們的User對象。

    public class User {

           private String login;

           private String hashedPassword;

           private Date lastLogin;

           @JSON(include=false)

           public String getHashedPassword() {

           }

        }

    Code Gone Wildcard

    您可以指定通配符在include() exclude() 方法調(diào)用時。這使得包括或排除幾個屬性變得非常容易。使用通配符去除類屬性的情況非常普遍。使用計算機通配符它變得非常容易。例如:

    public String doSomething( Object arg1, ... ) {

            User u = ...load a user...;

            return new JSONSerializer().exclude("*.class").serialize(p);

        }

    從類的所有路徑結(jié)尾將被排除。通配符匹配您指定的所有深度。 那么無論你的對象路徑多么深。 *.class排除配比對所有路徑深度。 因此,如果flexjson序列化與“foo.bar.class”路徑的屬性“*”“*.class”將匹配foo.bar

    通配符不擴展您在許多情況下序列化的深度。他們只操作您指定了的深度。這意味著如果您指定*.list,像路徑foo.list將被序列化,但是foo.bar.list將不會被序列化。如果您想要foo.bar.list被序列化,您需要另一個個包含foo.bar的聲明。以同樣的標(biāo)準(zhǔn)象*.class。每個對象有類成員由于Object.getClass ()。 然而*.class不會擴大您的序列化的深度。有序列化深度將被擴展的案件。當(dāng)做指定與遞歸結(jié)構(gòu)時的通配符您必須小心。如果您有一個樹結(jié)構(gòu)并且做了在*.children的一包括它一直將擴展您的序列化的深度。通配符將擴展您的序列化的另一個案件“*”。 那是相同的象做一次深刻的序列化如此使用它小心。

    Order of Evaluation

    Order of evaluation1.5改變了。即然我們談?wù)摿税ê团懦僮屛覀冋務(wù)?/span>Order of evaluation。如果我包括一個屬性我然后排除同樣的屬性將會發(fā)生什么? Flexjson將做什么?答案是包括和不包括正在評估,以便他們補充說。這對通配符的介紹是重要的。我想要序列化對象的二個屬性。我可以做以下:

    public String doSomething( Object arg1, ... ) {

            User u = ...load a user...;

            return new JSONSerializer().include("username").exclude("*").serialize(p);

        }

    上述代碼將序列化用戶對象的username屬性,但是它將排除其他屬性。如果我換一下includeexclude方法的順序?qū)⑴懦械膶傩裕⑶?span lang="EN-US">username屬性不會被包括的。這是為什么?這是因為在內(nèi)部flexjson將有一份表達式的列表。它就像是下面的清單:

             [ "*", "username" ];

    Flexjson將訪問User對象的每個領(lǐng)域,并且根據(jù)列表中的表達式規(guī)則來評估它。一旦它發(fā)現(xiàn)第一個匹配的就會停止下來。 在這種情況下“*”將匹配User對象的所有屬性,并且它排除他們。因而不會到達username

    Deep Serialization

    1.2中增加了一個新的特性,使用deepSerialize ()方法進行對象的一次深刻的序列化。 與Serialize ()方法deepSerialize ()方法將使用包括,排除和注解來推測什么是您想要的。然而,包括通常是重復(fù)的除了在您想要代理傭金在領(lǐng)域的一個排除的注釋的案件。深刻的連續(xù)廣播不會如此將連載在您的圖表的周期,如果您有定向關(guān)系說的雙父母有一個孩子,并且孩子有一個父母。后面參考從孩子到父母在JSON產(chǎn)品不會包括。 這是同樣淺連續(xù)廣播的。 這一個快的例子:

    public String doSomething( Object arg1, ... ) {

                Person p = ...load a person...;

                return new JSONSerializer().deepSerialize(p); // send the entire graph starting at person

        }

    應(yīng)節(jié)制使用deepSerialize ()方法,你真正的了解什么是系列化的本質(zhì)的唯一的情況下。深刻的序列化可能會發(fā)送大量數(shù)據(jù),超過你期望的數(shù)據(jù),如果你用它草率。

    Transformers More Than Meets the Eye

    1.5增加了一個扣人心弦的新的特點。假設(shè)我們有一些JSON文本數(shù)據(jù),并且我們設(shè)置它進入到頁面,但是這數(shù)據(jù)包含不友好的HTML。我的意思是你可能有象< >或者&。我們需要用&lt;, &gt;, &amp;替換我們的文本的那些部分。您怎么做?在先前版本你需要設(shè)置特定的getters/setters方法對你的域模型執(zhí)行轉(zhuǎn)換,你必須這樣做在客戶端。 噢是的,我肯定您可能做的更加離奇,但是這些是cleanest解答。

    轉(zhuǎn)換器通過讓您指定轉(zhuǎn)換的對象在與Flexjson的序列化論及這個問題對particpate Flexjson包括非常簡單的HTMLEncoder為你做實體替換。這它怎么運作。

    public String doSomething( Object arg1, ... ) {

                EMail mail = ...load an email...;

                return new JSONSerializer().transform( new HTMLEncoder(), "to", "cc", "bcc", "from").serialize(p);

        }

    在上述代碼transform ()方法中注冊了HTMLEncoder轉(zhuǎn)換器為4個屬性做序列化。

    電子郵件通常有象以下在接收者屬性:"Plug 1" <plug1@delasoul.com>不幸地,HTML不識別“<“和“>”,因此您需要在HTML中轉(zhuǎn)碼。變換器方法支持點符號,但是它不支持通配符。這樣做使查找轉(zhuǎn)換器實體算法更加快速。

    轉(zhuǎn)換器是非常有趣,你可以利用它們解決各種困難。當(dāng)您接受在新的wiki軟件的減號符號時。使用轉(zhuǎn)換器您可以在DB存放減號符號的文本,以后可以讀取到HTML頁面。

    由于安全原因您只想要接受某些從用戶發(fā)來的HTML標(biāo)記。當(dāng)送它通過JSON時,轉(zhuǎn)換器能過濾您的對象的所有惡毒數(shù)據(jù)。轉(zhuǎn)換器是非常有用的,并且Flexjson在將來將包括更多轉(zhuǎn)換器。

    Thread safety and Reuse

    最后, jsonserializer實例可以再序列化許多同一類型的對象。一旦你實例化對象,你可以再用它運行多個線程,只要你不要求包括或排除方法。通常這不是一個問題,因為你可能會遵循這一模式的實例:

    public class PersonController {

            JSONSerializer personSerializer;

            public PersonController() {

                personSerializer = new JSONSerializer().include("addresses.zipcdoe");

            }

            public String listPerson() {

               Person p = ....;

               return personSerializer.serialize( p );

            }

            public String editPerson() {

               Person p = ....;

               return personSerializer.serialize( p );

            }

        }

    The End

    歡迎到http://www.tutu6.com來看看




    posted on 2008-06-25 10:46 Cloud kensin 閱讀(4597) 評論(2)  編輯  收藏 所屬分類: Java

    評論

    # re: Flex Json文檔[未登錄] 2008-12-04 22:41 Nick

    翻譯得不錯。

    如果必須使用在JDK1.4 使用json還有啥辦法沒有?  回復(fù)  更多評論   

    # re: Flex Json文檔 2008-12-10 12:44 Cloud kensin

    @Nick
    自己去組裝數(shù)據(jù),也可以這么做,夠靈活,有點累而已,呵呵  回復(fù)  更多評論   

    <2008年12月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(4)

    隨筆分類

    相冊

    相冊

    搜索

    最新評論

    主站蜘蛛池模板: 久久亚洲国产伦理| 三年片免费高清版 | 在线综合亚洲欧洲综合网站| 99在线视频免费| 久久国产亚洲精品无码| 亚洲精品无码中文久久字幕| 免费高清av一区二区三区| 亚洲偷偷自拍高清| 嫩草视频在线免费观看| 亚洲AV无码专区在线电影成人| 一级有奶水毛片免费看| 亚洲无线码在线一区观看| 亚洲中文无码mv| 精品久久洲久久久久护士免费| 亚洲A∨无码无在线观看| 久草免费福利资源站| 亚洲系列国产精品制服丝袜第| 成人嫩草影院免费观看| 99久久精品日本一区二区免费| 国产成人精品日本亚洲专区| 国产一区二区免费| 亚洲欧洲国产经精品香蕉网| 成年男女男精品免费视频网站 | 黄视频在线观看免费| 免费毛片在线播放| 深夜福利在线视频免费| 最近免费中文字幕大全视频| 亚洲国产精品自在线一区二区| 窝窝影视午夜看片免费| 国产亚洲无线码一区二区| 1000部拍拍拍18免费网站| 亚洲av纯肉无码精品动漫| 亚洲日韩av无码| 女人被男人桶得好爽免费视频 | 亚洲一级黄色视频| 日韩在线永久免费播放| 亚洲国产成人一区二区精品区| 国产精品九九久久免费视频 | 亚洲第一男人天堂| 亚洲午夜精品久久久久久浪潮| 男女男精品网站免费观看|