iteye_16248 2008-06-19 13:58
浏览 546
已采纳

用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条回答 默认 最新

  • iteye_17163 2008-06-20 16:54
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题