`

与JSON的第一次亲密接触

阅读更多

   字符串型的Date转化为JavaBean的问题终于解决了,现在回过头来整理下贴在博客里以备将来查询,若对别人能所帮助那就甚是欣慰了.

1, 情景再现.

     问题是这样的,浏览器那边要Ajax地传来一些数据,其中包含的Date格式为"mm/dd/yyyy hh:mm:ss".Server与Client的数据传送用JSON来封装.JSON的优点在此就不用多说了,数据从Client传到Server端后就要用JSON来自动生成相应的JavaBean.对于primitive和String类型的数据在转化时没什么问题,可在当处理字符串表示的Date信息时麻烦就来了.
   为了简化谈论,我采用了一个只包含Date类型属性的Person类来做实验.Person类的定义如下:


 public class Person{     
    private java.util.Date birthday;     
     
    // settor and gettor methods.....     
 }


   在Main方法中采用能想到的方法来把JSON格式的字符串转为JavaBean.
import net.sf.json.JSONObject;     
       
   public class PersonTest {     
            
       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());     
       }     
   }   


  可一运行,问题就出来,下面是所报的信息.
引用

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  


    注意,虽然这也有时间信息打印了出来,可细看发现它不是我们所期待的那个,它是系统的当前时间.

     这是怎么回事呢?所报的信息是什么意思?怎么出来的是系统的当前时间?

2,试着分析/解决

   2.1 找准突破口

百度/Google一番后,没找到合适或相似的解决方案,问同学同事也没有得到满意的回答,于是就想着自己来解决了.可自己对JSON的了解也仅仅停留在为数不多常用方法上,其余像"它背后是怎么实现的?都可做哪些配置?"这样的问题一点也不知道了.


[align=left][/align]看API,一是由于API里的类/接口有二十来个,虽然跟Hibernate或Spring这样的大框架里类/接口在数量上没法比,但现在要有针对性地看时真的不知从哪个开始了,于是一会儿看下JsonConfig,过会再看下...,再有就是API里的描述很少自己也不能静下心来认真地看仔细地琢磨(这大概是源自于自己编码不规范造成的对API描述没有多少信任感吧).有没有跟Hibernate里类似的document呢?或许里有相关的描述.


再往下就习惯性地用debug来跟踪代码的执行,(幸好Java里有很多很多的开源项目,debug跟踪起来了丝毫不奋进费劲.)跟踪了一两遍后除了发现是什么时候报出上述信息外还是一头雾水.没别的办法再继续吧,随着跟踪的次数增多,前面看API时注意到的那些类活了起来,它们之间的调用关系渐渐地露出了来.在这个调用过程中围绕信息报出的那几行代码里的一个概念Morpher吸引了我的注意,意识到这就是问题的突破口.(感觉自己在写侦探小说.)
1
0
分享到:
评论
3 楼 rmn190 2008-12-11  
to jxncligang:

抱歉, 我刚看到你的留言,

解决方法是:

在toBean前加一句话:JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] {"MM/dd/yyyy HH:mm:ss"}) );来配置记下Date转化时的Morpher就OK了
2 楼 jxncligang 2008-12-06  
請問是如何解決的呢,我也有同樣問題
jxncligang@163.com
1 楼 java.fan 2008-06-30  
你用 long 类型来表示 日期时间,不行吗?
再多传个表示时间格式的 参数,就差不多了.

相关推荐

Global site tag (gtag.js) - Google Analytics