`

用json时的一个问题

阅读更多
假设有一个Person类,
public class Person{   
   private java.util.Date birthday;   
  
   // settor and gettor methods.....   
}  


现在客户端那边传来如下的json规则的字符串String personJson = "{birthday:\"06/28/2008 17:00:00\"}",要用
JSONOjbect.toBean(JSONObject.from(personJson ),Person.class)方法来获得相应的Person实例时就出问题了,报错如下:

[align=center]2008-6-19 13:57:39 net.sf.json.JSONObject morphPropertyValue   
警告: Can't transform property 'birthday' from java.lang.String into java.util.Date. Will register a default Morpher   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
信息: Property 'java.util.Date.class' has no write method. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.date' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
信息: Property 'java.util.Date.day' has no write method. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.hours' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.minutes' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.month' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.seconds' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.time' does not exist. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
信息: Property 'java.util.Date.timezoneOffset' has no write method. SKIPPED.   
2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph   
警告: Property 'java.lang.String.year' does not exist. SKIPPED.   
Person's brithday: Thu Jun 19 13:57:39 CST 2008  
  [/align]


注意这里虽然有"Person's brithday: Thu Jun 19 13:57:39 CST 2008  "这样输出,但它的时间值与输入不符.

这个怎么解决?

以下是我做实验用的Java代码:
=======================
package json;   
  
import java.util.Date;   
  
import net.sf.json.JSONObject;   
  
public class Person {   
    private Date birthday;   
  
    public Date getBirthday() {   
        return birthday;   
    }   
  
    public void setBirthday(Date birthday) {   
        this.birthday = birthday;   
    }   
       
    public static Person getInstance(String jsonVale) {   
        return (Person)JSONObject.toBean(JSONObject.fromObject(jsonVale),Person.class);   
    }   
       
    public static void main(String[] args) {   
        String personJson = "{birthday:\"06/28/2008 17:00:00\"}";   
           
        Person p = getInstance(personJson);   
           
        System.out.println("Person's brithday: "+ p.getBirthday());   
    }   
}  


====
所需Jar包见附件.
分享到:
评论
2 楼 rmn190 2008-08-06  
<pre name='code' class='java'>class MapToDateMorpher extends AbstractObjectMorpher { //https://sourceforge.net/forum/forum.php?thread_id=1861466&amp;forum_id=587134
private static String DATE_TIME_FORMAT  = "MM/dd/yyyy HH:mm:ss";
static SimpleDateFormat dateTimeFormat = new SimpleDateFormat(DATE_TIME_FORMAT);
   
    static TimeZone pstTimeZone = TimeZone.getTimeZone("PST");
   

public Object morph(Object value) {
if(value instanceof String) {
String s = (String)value;
return convertStringToTimestamp(s);
}
return null;
}

public Class morphsTo() {
return Date.class;
}

public boolean supports(Class clazz) {
// return clazz.equals(String.class);
return String.class.isAssignableFrom( clazz );
}

private  Date  convertStringToTimestamp(String input){

        if(!StringUtils.isEmpty(input)){
            try {
return dateTimeFormat.parse(input);
} catch (ParseException e) {
}
        }

        return null;
    }
}</pre>
 
1 楼 ham 2008-06-19  
这是因为你在json中的字符串类型的"06/28/2008 17:00:00"
在java中没有办法直接转换成为Date类型的数据.因而报出了异常

你需要通过JsonValueProcessor类,进行日期的转换格式.

解决方法可以参见:
[url]http://bolingsky.blog.sohu.com/74165282.html [/url]

里面有详细描述.

相关推荐

Global site tag (gtag.js) - Google Analytics