Dict.CN 在线词典, 英语学习, 在线翻译

都市淘沙者

荔枝FM Everyone can be host

统计

留言簿(23)

积分与排名

优秀学习网站

友情连接

阅读排行榜

评论排行榜

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

source:
http://hi.baidu.com/learnfordba/blog/item/0ee6cdfb7d61fb859f5146f8.html


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]

posted on 2011-08-14 12:00 都市淘沙者 阅读(11862) 评论(0)  编辑  收藏 所属分类: Android/J2ME/Symbian/Jabber


只有注册用户登录后才能发表评论。


网站导航: