zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    【hdoj_1133】Buy the Ticket(卡特兰数+大数)
    【hdoj_1042】N!(大数)
    【hdoj_1002】A+B Problem ||(大数)
    【hdoj_2566】统计硬币(母函数?)
    【转载】自定义View,有这一篇就够了
    【转载】自定义View学习笔记之详解onMeasure
    【转载】深入剖析自定义View之onMeasure
    【转载】【凯子哥带你学Framework】Activity启动过程全解析
    【转载】【凯子哥带你学Framework】Activity界面显示全解析(下)
    【转载】【凯子哥带你学Framework】Activity界面显示全解析(上)
  • 原文地址:https://www.cnblogs.com/raker/p/3334453.html
Copyright © 2011-2022 走看看