用json时的一个问题,

假设有一个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]

这个怎么解决?

以下是我做实验用的Java代码:

[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!

8个回答

到网上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。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问