JSON JavaBean 互转工具

本文对比了Gson和json-lib两个Java库在JSON与JavaBean互相转换方面的使用体验。Gson采用反射机制,类型转换严格;json-lib则利用ezmorph进行对象转换,支持基本类型并易于使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在json.org上面可以看到现在java方面的支持json的开源项目很多。

最近稍微看了下gson和json-lib,第一次使用印象如下:

1、gson提供了一个JSON<-->JavaBean相互转换的框架,采用了java中的reflect,同时类型转换要求比较严格, 如果是图方便最好还是用json-lib。第一眼就没看出来怎么用,后来才发现:

  1. //json->java
  2.         String src = "{/"date/":/"2008-10-25/",/"str/":/"sss/",/"i/":23,/"l/":333443,/"d/":1.23}";
  3.         Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
  4.         BeanA a = gson.fromJson(src, BeanA.class);

  1. //java->json
  2.         Gson gson = new GsonBuilder()
  3. //      .registerTypeAdapter(BeanA.class, new JsonSerializer<BeanA>(){
  4. //
  5. //
  6. //          public JsonElement serialize(BeanA src, Type typeOfSrc,
  7. //                  JsonSerializationContext context) {
  8. //              JSONObject obj = JSONObject.fromObject(src);
  9. //              JsonObject e =  new JsonObject();
  10. //              Iterator<String> its = obj.keys();
  11. //              while(its.hasNext()){
  12. //                  String key = its.next();
  13. //                  e.addProperty(key, obj.getString(key));
  14. //              }
  15. //              return e;
  16. //          }
  17. //          
  18. //      })
  19. //      .registerTypeAdapter(Object.class, new JsonSerializer<Object>(){
  20. //          public JsonElement serialize(Object src, Type typeOfSrc,
  21. //                  JsonSerializationContext context) {
  22. //              JSONObject obj = JSONObject.fromObject(src);
  23. //              JsonObject e =  new JsonObject();
  24. //              Iterator<String> its = obj.keys();
  25. //              while(its.hasNext()){
  26. //                  String key = its.next();
  27. //                  e.addProperty(key, obj.getString(key));
  28. //              }
  29. //              return e;
  30. //          }
  31. //          
  32. //      })
  33.         .create();
  34.         
  35.         BeanA a = new BeanA();
  36.         a.setD(Double.valueOf("1.23"));
  37.         a.setDate(new Date());
  38.         a.setI(Integer.valueOf(23));
  39.         a.setL(Long.valueOf("333443"));
  40.         a.setStr("sss");
  41.         
  42.         Map m = new HashMap();
  43.         m.put("a"1);
  44.         m.put("b", 1l);
  45.         m.put("c"true);
  46.         m.put("d""str");
  47.         
  48.         Map mA = new HashMap();
  49.         mA.put("bean", a);
  50.         
  51.         Type mapType = new TypeToken<Map<String, String>>() { }.getType();
  52.         String rs = gson.toJson(m,mapType);
  53.         System.out.println(rs);
  54.         
  55.         Type mapTypeA = new TypeToken<Map<String, BeanA>>() { }.getType();
  56.         String rsA = gson.toJson(mA,mapTypeA);
  57.         System.out.println(rsA);
  58.         
  59.         Type mapTypeB = new TypeToken<BeanA>() { }.getType();
  60.         String rsB = gson.toJson(a,mapTypeB);
  61.         System.out.println(rsB);
  62.         
  63.         
  64.         Type mapTypeC = new TypeToken<Date>() { }.getType();
  65.         String rsC = gson.toJson(new Date(),mapTypeC);
  66.         System.out.println(rsC);

不过它的代码是个学习jdk1.5中的泛型的好资料。

2、json-lib使用了ezmorph进行对象之间的转换,已经实现了基本类型的转换支持。基本使用上手较快。


3、json-lib由于使用了ezmorph进行转换,其java.util.Date的转换方式已经实现了,只需要手动注册需要的转换的pattern即可。
 注册方法为:
  1.         JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[]{
  2.                 "yyyy-MM-dd HH:mm",
  3.                 "yyyy-MM-dd"
  4.         }));
  5.         // 然后调用json->bean的方法
  6.        Object a = JSONObject.toBean(JsonSrc);
  7.        //or
  8.        JSONSerializer.toJava(JsonSrc);
  9.                
4、从json-lib的框架结构来看,在jsonconfig中提供了较好的java->json转换的接口,而json->java中默认使用了ezmorph中的转换方法,并且没有在jsonconfig中进行体现,只是全局都使用了 JSONUtils.getMorpherRegistry()进行处理。所以要注册json->java的转换方法,貌似只能通过以上方法进行。
      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值