The Basics
flexjson采取了不同的做法,让你方便地控制序列化的深度。它与hibernate有个十分相似的概念延迟加载,允许你有一个连接对象模型,但控制哪些对象被加载了是在你的数据库之外执行。让我们来看一个简单的例子,让你感觉一下flexjson library如何工程。我们序列化一个Person的实例。我们不妨做到以下几点:
public String doSomething( Object
arg1, ... ) {
Person p = ...load a person...;
JSONSerializer serializer = new JSONSerializer();
return serializer.serialize( p );
}
上述代码将会产生下列输出:
{
"class": "Person",
"name": "William Shakespeare",
"birthday": -12802392000000,
"nickname": "Bill"
}
Working With Includes
看起来几乎像你所期待的。然而我们的Person对象包含了更多的属性比如姓名,生日,昵称,还有电话号码和地址?默认情况下flexjson序列化对象的直接属性。这只是一个浅层的代表对象。所有容器类都是没有系列化。或者说,一对多的关系和多对多的关系并没有序列化。是指对象引用系列化。还有多对一的关系和一对一的关系将被序列化。这一点与其他的library一样,像Hibernate和JPA默认是热切加载。但是我们希望包括phonenumbers属性,然后我们可以做到以下几点:
public String doSomething( Object
arg1, ... ) {
Person p = ...load a person...;
return new JSONSerializer().include("phoneNumbers").serialize(p);
}
在这个例子中,我们将告诉序列化器对象包括的属性。容器类的系列化是浅层复制包括的对象内容。所以在我们的例子中,Person有个List类型的属性叫phonenumbers ,List类中包含Phong实例。这意味着flexjson将浅拷贝的Person,名单phonenumbers ,浅拷贝的每一个电话,例如内部的名单上。所以输出可能看起来是这样的:
{
"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,你可以执行两次include方法,或者你可以包括两个参数,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 数据模型。不过,我并没有发现有任何JSON的library提供这种类型的系列化。下面是一个例子:
public String
getPeople( Object arg1, ... ) {
List people = ...load a person...;
return new JSONSerializer().include("phoneNumbers").serialize("people",
people);
}
上述代码将会产生下列输出:
{
"people" : [
{
"class": "Person",
"name": "Warren Buffet",
"birthday": -1241467200000,
"nickname": "Oracle of Omaha",
"phonNumbers" : [ ... ],
},
{
"class": "Person",
"name": "Steven Jobs",
"birthday": -468702000000,
"nickname": "Steve",
"phonNumbers" : [ ... ],
}
]
}