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對象包含了更多的屬性比如姓名,生日,昵稱,還有電話號碼和地址?默認情況下flexjson序列化對象的直接屬性。這只是一個淺層的代表對象。所有容器類都是沒有系列化?;蛘哒f,一對多的關系和多對多的關系并沒有序列化。是指對象引用系列化。還有多對一的關系和一對一的關系將被序列化。這一點與其他的library一樣,像Hibernate和JPA默認是熱切加載。但是我們希望包括phonenumbers屬性,然后我們可以做到以下幾點:
public String doSomething( Object
arg1, ... ) {
Person p = ...load a person...;
return new JSONSerializer().include("phoneNumbers").serialize(p);
}
在這個例子中,我們將告訴序列化器對象包括的屬性。容器類的系列化是淺層復制包括的對象內(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"
}
]
}
熟悉這個用法了?這實在是太簡單。如果你想包含phonenumbers和address,你可以執(zhí)行兩次include方法,或者你可以包括兩個參數(shù),include方法使用了Java的新語法功能。我個人較喜歡因為我認為這將令程序短小且易于閱讀。但是,那是你自己的選擇。
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( )方法允許您指定一個外部對象集合。也有一些JavaScript的library象EXTJS((previously
known as YUI-EXT)要求這為他們的JSON 數(shù)據(jù)模型。不過,我并沒有發(fā)現(xiàn)有任何JSON的library提供這種類型的系列化。下面是一個例子:
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" : [ ... ],
}
]
}