/** * 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 btpka3@163.com * @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(); }
/** * * 当运行以下代码代码时,大家会期待怎样的结果呢?(直接数据Date对象,而不是包含 Date类型字段的JavaBean) *
* * 结果是,不是 "yyyy-MM-dd HH:mm:ss.SSS z" 格式的字符串,而是 JsDateJsonBeanProcessor 生成的 * javascript Object (以"{"开始,以"}"结束),为什么呢?是否是因为无法 * 将单独的一个字符串表达为一个JSON表示的字符串?所以就启用 JsonBeanProcessor 将其表示为一个JSON表示的Object? *
* * 应该与 JsonBeanProcessor、JsonValueProcessor 这两个接口有关。分别有自带的 * 关于日期转换的实现:JsDateJsonValueProcessor、JsDateJsonBeanProcessor,其中 * JsDateJsonValueProcessor 內部是依靠 JsDateJsonBeanProcessor 实现。可是却在 * Json-lib的源代码里找不到他们何时被注册的。所以我无法将其unregister。 *
* */ 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); }
}
|