java与json互相转换(解决日期问题)
JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非常适合于服务器与 JavaScript 的交互。本文主要讲解下java和JSON之间的转换,特别是解决互相转换遇到日期问题的情况。 一、需要相关的jar包: json-lib-xxx.jar ezmorph-xxx.jar commons-httpclient-xxx.jar commons-lang-xxx.jar commons-logging-xxx.jar commons-collections-xxx.jar 上面的包可以从下面的连接下载: http://commons.apache.org/index.html http://json-lib.sourceforge.net http://ezmorph.sourceforge.net 二、java-》JSON 1.List-》JSON view plaincopy to clipboardprint? List<String> list = new ArrayList<String>(); list.add("apple"); list.add("orange"); JSONArray jarr = JSONArray.fromObject(list); System.out.println("list->json:" + jarr.toString()); 打印结果:list->json:["apple","orange"] 2.Map-》JSON view plaincopy to clipboardprint? Map<String, Object> map = new HashMap<String, Object>(); map.put("name", "Michael"); map.put("baby", new String[] { "Lucy", "Lily" }); map.put("age", 30); JSONObject jo = JSONObject.fromObject(map); System.out.println("map->json:" + jo.toString()); 打印结果:map->json:{"age":30,"name":"Michael","baby":["Lucy","Lily"]} 3.bean->JSON view plaincopy to clipboardprint? JsonBean bean = new JsonBean(); bean.setName("NewBaby"); bean.setAge(1); bean.setBorn(new Date()); jo = JSONObject.fromObject(bean); System.out.println("bean->json:" + jo.toString()); 打印结果:bean->json:{"age":1,"born":{"date":10,"day":3,"hours":14,"minutes":14,"month":2,"seconds":1,"time":1268201641228,"timezoneOffset":-480,"year":110},"name":"NewBaby"} 这时你会发现它把bean对象里的util.Date这个类型的所有属性一一转换出来。在实际运用过程中,大多数情况下我们希望能转化为yyyy-MM-dd这种格式,下面就讲一讲如何实现: 首先要写一个新的类JsonDateValueProcessor如下: view plaincopy to clipboardprint? /** * JSON 日期格式处理(java转化为JSON) * @author Michael sun */ public class JsonDateValueProcessor implements JsonValueProcessor { /** * datePattern */ private String datePattern = "yyyy-MM-dd"; /** * JsonDateValueProcessor */ public JsonDateValueProcessor() { super(); } /** * @param format */ public JsonDateValueProcessor(String format) { super(); this.datePattern = format; } /** * @param value * @param jsonConfig * @return Object */ public Object processArrayValue(Object value, JsonConfig jsonConfig) { return process(value); } /** * @param key * @param value * @param jsonConfig * @return Object */ public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) { return process(value); } /** * process * @param value * @return */ private Object process(Object value) { try { if (value instanceof Date) { SimpleDateFormat sdf = new SimpleDateFormat(datePattern, Locale.UK); return sdf.format((Date) value); } return value == null ? "" : value.toString(); } catch (Exception e) { return ""; } } /** * @return the datePattern */ public String getDatePattern() { return datePattern; } /** * @param pDatePattern the datePattern to set */ public void setDatePattern(String pDatePattern) { datePattern = pDatePattern; } } 测试代码: view plaincopy to clipboardprint? JsonBean bean = new JsonBean(); bean.setName("NewBaby"); bean.setAge(1); bean.setBorn(new Date()); JsonConfig jsonConfig = new JsonConfig(); jsonConfig.registerJsonValueProcessor(Date.class,new JsonDateValueProcessor()); JSONObject jo = JSONObject.fromObject(bean, jsonConfig); System.out.println("bean->json:" + jo.toString()); 打印结果:bean->json:{"age":1,"born":"2010-03-10","name":"NewBaby"} 这就能得到我们想要的结果了。 三、JSON-》java 1.如何把json的yyyy-MM-dd的转换为Bean中的util.Date类型: view plaincopy to clipboardprint? JSONUtils.getMorpherRegistry().registerMorpher( new DateMorpher(new String[] { "yyyy-MM-dd" })); String jsonStr = "[{\"name\": \"husband\", \"age\": \"26\", \"born\": \"1984-01-12\"},{\"name\": \"wife\", \"age\": \"20\", \"born\": \"1990-05-01\"}]"; Collection<JsonBean> list = JSONArray.toCollection(JSONArray.fromObject(jsonStr), JsonBean.class); //DateUtil.getFormatDate(date,fmtstr)日期转字符串这里不再写代码了 for (JsonBean o : list) { System.out.println(DateUtil.getFormatDate(o.getBorn(), "yyyy-MM-dd")); } 打印结果: 1984-01-12 1990-05-01 2. JSON-》List、 Map view plaincopy to clipboardprint? String listStr = "[\"apple\",\"orange\"]"; Collection<String> strlist = JSONArray.toCollection(JSONArray.fromObject(listStr)); for (String str : strlist) { System.out.println(str); } String mapStr = "{\"age\":30,\"name\":\"Michael\",\"baby\":[\"Lucy\",\"Lily\"]}"; Map<String, Object> map = (Map) JSONObject.toBean(JSONObject .fromObject(mapStr), Map.class); for (Entry<String, Object> entry : map.entrySet()) { System.out.println(entry.getKey() + " " + entry.getValue()); } 打印结果: apple orange name Michael age 30 baby [Lucy, Lily]