论坛首页 Web前端技术论坛

用json时的一个问题

浏览 4580 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-06-19  
假设有一个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包见附件.
   发表时间:2008-06-19  
这是因为你在json中的字符串类型的"06/28/2008 17:00:00"
在java中没有办法直接转换成为Date类型的数据.因而报出了异常

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

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

里面有详细描述.
0 请登录后投票
   发表时间:2008-08-06  
class MapToDateMorpher extends AbstractObjectMorpher { //https://sourceforge.net/forum/forum.php?thread_id=1861466&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;
    }
}
 
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics