与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());
}
}


可一运行,问题就出来,下面是所报的信息.
[quote]
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 [/quote]

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

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

2,试着分析/解决

2.1 找准突破口

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


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


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

你可能感兴趣的:(json,Bean,Java,.net,Hibernate)