假设有一个Person类,
[code="java"]
public class Person{
private java.util.Date birthday;
// settor and gettor methods.....
}
[/code]
现在客户端那边传来如下的json规则的字符串String personJson = "{birthday:\"06/28/2008 17:00:00\"}",要用
JSONOjbect.toBean(JSONObject.from(personJson ),Person.class)方法来获得相应的Person实例时就出问题了,报错如下:
[code="java"]
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
[/code]
这个怎么解决?
[code="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());
}
}
[/code]
[b]问题补充:[/b]
To ham:
你所说的那个方案是针对 bean --> Json的,而现在的问题是从Json到Bean.
[b]问题补充:[/b]
多谢各位的帮忙,现在这个问题解决了,也就是在toBean前加一句话:JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] {"MM/dd/yyyy HH:mm:ss"}) );来配置记下Date转化时的Morpher就OK了,大家有兴趣的话可以试下.
Thanks a lot!
到网上Google了一下午,一点相关的资料都没找到.
写了一个傻办法,先将就着用吧:
[code="java"]
package test;
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 jsonValue) {
JSONObject obj=JSONObject.fromObject(jsonValue);
//将birthday属性获取到
String strDate=(String)obj.get("birthday");
Date newDate=null;
//设置日期转换的格式
java.text.DateFormat formate = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
newDate = formate.parse(strDate);
}catch (Exception e) {
e.printStackTrace();
}
//移除原有的birthday属性
obj.remove("birthday");
//将日期类型的birthday放到obj中
obj.put("birthday", newDate);
return (Person)JSONObject.toBean(obj,Person.class);
}
public static void main(String[] args) {
String personJson = "{birthday:\"2008-06-28 17:00:00\"}";
Person p = getInstance(personJson);
System.out.println("Person's brithday: "+p.getBirthday());
}
}
[/code]
输出结果为:
[quote]
Person's brithday: Sat Jun 28 17:00:00 CST 2008
[color=red]2008-6-20 16:45:11 net.sf.json.JSONObject toBean
警告: Property 'day' has no write method. SKIPPED.
2008-6-20 16:45:11 net.sf.json.JSONObject toBean
警告: Property 'timezoneOffset' has no write method. SKIPPED.[/color]
[/quote]
那两个警告好像是因为在toBean()的时候,它把Date对象也当成了一个JSONObject对象进行处理.由于没有set方法而出现的.
我对java对json的操作也只是处于一知半解的状态,如果写的代码太幼稚.楼主表笑... :oops:
这是因为你在json中的字符串类型的"06/28/2008 17:00:00"
在java中没有办法直接转换成为Date类型的数据.因而报出了异常
你需要通过JsonValueProcessor类,进行日期的转换格式.
详细的内容可以参见:
[url]http://www.iteye.com/topic/169094[/url]
里面有详细代码.
汗...地址搞错鸟.
解决的方法可以参见:
[url]http://bolingsky.blog.sohu.com/74165282.html[/url]
里面有详细的代码.
要不你就手工处理下personJson里的时间日期部分``
用反射逐个调用
[code="java"]
for (Object object : jsonObject.entrySet()) {
Map.Entry entry = (Map.Entry) object;
String propertyName = entry.getKey().toString();
String propertyValue = entry.getValue().toString();
BeanUtils.setBeanPropertyByName(entity, propertyName, propertyValue);
}
[/code]
[color=red]{birthday:\"06/28/2008 17:00:00\"}[/color]Wrong
[color=green]{\"birthday\":\"06/28/2008 17:00:00\"}[/color]right
上面的BeanUtils.setBeanPropertyByName也说明下:
[code="java"]
public class BeanUtils {
public static void setBeanPropertyByName(T entity, String propertyName, String propertyValue) {
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(propertyName, entity.getClass());
Class propertyType = propertyDescriptor.getPropertyType();
Method setMethod = propertyDescriptor.getWriteMethod();
if (propertyType == java.sql.Date.class) {
setMethod.invoke(entity, DateUtils.getSqlDateFromString(propertyValue, "yyyy-MM-dd HH:mm:ss"));
} else ...
}
}
[/code]
用mozilla的rhino库,如果jdk1.6的话已经自带了。
执行json的脚本,然后构造你的Bean。