在json.org上面可以看到现在java方面的支持json的开源项目很多。
最近稍微看了下gson和json-lib,第一次使用印象如下:
1、gson提供了一个JSON<-->JavaBean相互转换的框架,采用了java中的reflect,同时类型转换要求比较严格, 如果是图方便最好还是用json-lib。第一眼就没看出来怎么用,后来才发现:
- //json->java
- String src = "{\"date\":\"2008-10-25\",\"str\":\"sss\",\"i\":23,\"l\":333443,\"d\":1.23}" ;
- Gson gson = new GsonBuilder().setDateFormat( "yyyy-MM-dd" ).create();
- BeanA a = gson.fromJson(src, BeanA. class );
- //java->json
- Gson gson = new GsonBuilder()
- // .registerTypeAdapter(BeanA.class, new JsonSerializer<BeanA>(){
- //
- //
- // public JsonElement serialize(BeanA src, Type typeOfSrc,
- // JsonSerializationContext context) {
- // JSONObject obj = JSONObject.fromObject(src);
- // JsonObject e = new JsonObject();
- // Iterator<String> its = obj.keys();
- // while(its.hasNext()){
- // String key = its.next();
- // e.addProperty(key, obj.getString(key));
- // }
- // return e;
- // }
- //
- // })
- // .registerTypeAdapter(Object.class, new JsonSerializer<Object>(){
- // public JsonElement serialize(Object src, Type typeOfSrc,
- // JsonSerializationContext context) {
- // JSONObject obj = JSONObject.fromObject(src);
- // JsonObject e = new JsonObject();
- // Iterator<String> its = obj.keys();
- // while(its.hasNext()){
- // String key = its.next();
- // e.addProperty(key, obj.getString(key));
- // }
- // return e;
- // }
- //
- // })
- .create();
- BeanA a = new BeanA();
- a.setD(Double.valueOf( "1.23" ));
- a.setDate( new Date());
- a.setI(Integer.valueOf( 23 ));
- a.setL(Long.valueOf( "333443" ));
- a.setStr( "sss" );
- Map m = new HashMap();
- m.put( "a" , 1 );
- m.put( "b" , 1l);
- m.put( "c" , true );
- m.put( "d" , "str" );
- Map mA = new HashMap();
- mA.put( "bean" , a);
- Type mapType = new TypeToken<Map<String, String>>() { }.getType();
- String rs = gson.toJson(m,mapType);
- System.out.println(rs);
- Type mapTypeA = new TypeToken<Map<String, BeanA>>() { }.getType();
- String rsA = gson.toJson(mA,mapTypeA);
- System.out.println(rsA);
- Type mapTypeB = new TypeToken<BeanA>() { }.getType();
- String rsB = gson.toJson(a,mapTypeB);
- System.out.println(rsB);
- Type mapTypeC = new TypeToken<Date>() { }.getType();
- String rsC = gson.toJson( new Date(),mapTypeC);
- System.out.println(rsC);
不过它的代码是个学习jdk1.5中的泛型的好资料。
2、json-lib使用了ezmorph进行对象之间的转换,已经实现了基本类型的转换支持。基本使用上手较快。
3、json-lib由于使用了ezmorph进行转换,其java.util.Date的转换方式已经实现了,只需要手动注册需要的转换的pattern即可。
注册方法为:
- JSONUtils.getMorpherRegistry().registerMorpher( new DateMorpher( new String[]{
- "yyyy-MM-dd HH:mm" ,
- "yyyy-MM-dd"
- }));
- // 然后调用json->bean的方法
- Object a = JSONObject.toBean(JsonSrc);
- //or
- JSONSerializer.toJava( JsonSrc );
-
4、从json-lib的框架结构来看,在jsonconfig中提供了较好的java->json转换的接口,而json->java中默认使用了ezmorph中的转换方法,并且没有在jsonconfig中进行体现,只是全局都使用了JSONUtils.getMorpherRegistry()进行处理。所以要注册json->java的转换方法,貌似只能通过以上方法 进行。