java与json互相转换(解决日期问题)

来源:互联网 发布:网络歌星人气排名 编辑:程序博客网 时间:2024/05/21 22:53

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 JsonDateValueProcessorimplements 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 (valueinstanceof 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]

0 0