/**
* Json-lib 的使用示例,Person Bean应该将使用到的种种数据类型都考虑到了。
*
* 因项目需要,需使用C#写的ActiveX控件与Java Web服务器端通过JSON来传递数据。
* 但是,XStream 无法满足要求,它无法将List按照Array对待,无法将Map按照Bean对待。
*
* 所以使用JSON-lib,可能是开源代码无利可图的原因吧,也就版本发布及时,其他的,比如
* JavaDoc,网站上的使用说明等非常非常的少。下面这个例子则介绍了如何使用Json-lib的
* 扩展机制将Date类型按指定格式序列化,和反序列化,以及将byte[]按照Base64进行序列化
* 和反序列化。
*
* 网上也有推荐使用 jsontools,和gson的,但是时间、精力有限,未做详查!
*
* @author [email protected]
* @date 2010/03/14
*/
package test.json_lib;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.util.CycleDetectionStrategy;
import net.sf.json.util.JSONUtils;
public class Test {
public static void main(String[] args) {
testJson();
}
/**
* <p>
* 当运行以下代码代码时,大家会期待怎样的结果呢?(直接数据Date对象,而不是包含 Date类型字段的JavaBean)
* </p>
* <p>
* 结果是,不是 "yyyy-MM-dd HH:mm:ss.SSS z" 格式的字符串,而是 JsDateJsonBeanProcessor 生成的
* javascript Object (以"{"开始,以"}"结束),为什么呢?是否是因为无法
* 将单独的一个字符串表达为一个JSON表示的字符串?所以就启用 JsonBeanProcessor 将其表示为一个JSON表示的Object?
* </p>
* <p>
* 应该与 JsonBeanProcessor、JsonValueProcessor 这两个接口有关。分别有自带的
* 关于日期转换的实现:JsDateJsonValueProcessor、JsDateJsonBeanProcessor,其中
* JsDateJsonValueProcessor 內部是依靠 JsDateJsonBeanProcessor 实现。可是却在
* Json-lib的源代码里找不到他们何时被注册的。所以我无法将其unregister。
* </p>
*
*/
public static void testDate() {
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class,
new DateJsonValueProcessor());
JSONObject descJsonObj = JSONObject.fromObject(Calendar.getInstance()
.getTime(), jsonConfig);
System.out.println(descJsonObj.toString(2));
}
public static void testJson() {
Person son = new Person();
Person mom = new Person();
son.setName("SSS");
son.setAge(25);
son.getAge();
son.setMale(true);
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.YEAR, -son.getAge());
calendar.set(Calendar.MONTH, 8);
calendar.set(Calendar.DAY_OF_MONTH, 9);
calendar.set(Calendar.HOUR_OF_DAY, 9);
calendar.set(Calendar.MINUTE, 9);
calendar.set(Calendar.SECOND, 9);
son.setBirthday(calendar.getTime());
son.setAlias(new String[] { "SSS0", "SSS00", "SSS000" });
son.setImageData(new byte[] { 1, 2, 3, 4, 5, 10, 20, 30, 40, 50 });
son.setFavors(Arrays.asList(new String[] { "Listening music",
"Sleeping", "Play games", " test \n\t<>,\"\"_'ABC'&&|| " }));
Map<String, String> addrs = new HashMap<String, String>();
addrs.put("Work", "Beijing");
addrs.put("School", "Shandong");
addrs.put("Home", "Henan");
son.setAddrs(addrs);
son.setParent(mom);
mom.setName("MMM");
mom.setAge(50);
mom.setMale(false);
calendar = Calendar.getInstance();
calendar.add(Calendar.YEAR, -mom.getAge());
mom.setBirthday(calendar.getTime());
mom.setAlias(new String[] { "MMM0", "MMM00", "MMM000" });
mom.setImageData(new byte[] { 6, 7, 8, 9, 0, 60, 70, 80, 90, 100 });
mom.setFavors(Arrays.asList(new String[] { "Enjoy cate", "Chatting",
"Shopping" }));
addrs = new HashMap<String, String>();
addrs.put("Work", "Viliage");
addrs.put("School", "Viliage");
addrs.put("Home", "Viliage");
mom.setAddrs(addrs);
mom.setChild(son);
System.out.println("\n-------------Son:");
System.out.println(son);
///////////// 序列化 /////////////////////////////////////////////////
JsonConfig jsonConfig = new JsonConfig();
// 因为 mom 和 son 之间通过 setChild() 和 setParent() 相互引用,从而造成
// 环状引用,需要指定相应的解决机制,这里为使用 null 或者 空的 array 解决。
jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
// 注册我们的 Date 序列化类
jsonConfig.registerJsonValueProcessor(java.util.Date.class,
new DateJsonValueProcessor());
// 注册我们的 byte[] 序列化类
jsonConfig.registerJsonValueProcessor(byte[].class,
new ByteArrayJsonValueProcessor());
// 序列化
JSONObject toJsonObj = JSONObject.fromObject(son, jsonConfig);
String json = toJsonObj.toString(2);
System.out.println("\n-------------toJSON:");
System.out.println(json);
///////////// 反序列化 /////////////////////////////////////////////////
// 注册我们需要的 Date 格式的反序列化类
JSONUtils.getMorpherRegistry().registerMorpher(
new DateMorpher(new String[] { "yyyy-MM-dd HH:mm:ss.SSS z" }));
// 注册我们将 base64字符串反序列化为 byte[] 的类
JSONUtils.getMorpherRegistry()
.registerMorpher(new MyByteArrayMorpher());
// 反序列化
JSONObject fromJsonObj = JSONObject.fromObject(json);
Person newSon = (Person) JSONObject.toBean(fromJsonObj, Person.class);
System.out.println("\n-------------fromJSON:");
System.out.println(newSon);
}
}
|