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 有偿求码,CNN+LSTM实现单通道脑电信号EEG的睡眠分期评估
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路