问题描述
假设有一个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实例时就出问题了,报错如下: 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 Morpher2008-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 这个怎么解决?以下是我做实验用的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());}}问题补充:To ham: 你所说的那个方案是针对 bean --> Json的,而现在的问题是从Json到Bean.问题补充:多谢各位的帮忙,现在这个问题解决了,也就是在toBean前加一句话:JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] {"MM/dd/yyyy HH:mm:ss"}) );来配置记下Date转化时的Morpher就OK了,大家有兴趣的话可以试下.Thanks a lot!
解决方案
到网上Google了一下午,一点相关的资料都没找到.写了一个傻办法,先将就着用吧: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()); }}输出结果为:引用Person's brithday: Sat Jun 28 17:00:00 CST 20082008-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.那两个警告好像是因为在toBean()的时候,它把Date对象也当成了一个JSONObject对象进行处理.由于没有set方法而出现的.我对java对json的操作也只是处于一知半解的状态,如果写的代码太幼稚.楼主表笑...
解决方案二:
用mozilla的rhino库,如果jdk1.6的话已经自带了。执行json的脚本,然后构造你的Bean。
解决方案三:
上面的BeanUtils.setBeanPropertyByName也说明下:public class BeanUtils { public static <T> 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 ... }}
解决方案四:
{birthday:"06/28/2008 17:00:00"}Wrong{"birthday":"06/28/2008 17:00:00"}right
解决方案五:
用反射逐个调用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);}
解决方案六:
要不你就手工处理下personJson里的时间日期部分``
解决方案七:
汗...地址搞错鸟.解决的方法可以参见: http://bolingsky.blog.sohu.com/74165282.html里面有详细的代码.
解决方案八:
这是因为你在json中的字符串类型的"06/28/2008 17:00:00"在java中没有办法直接转换成为Date类型的数据.因而报出了异常你需要通过JsonValueProcessor类,进行日期的转换格式.详细的内容可以参见:http://www.iteye.com/topic/169094里面有详细代码.