小弟在做一些和JSON有关的工作
使用JSON-LIB进行转换
JDK是1.4当Java对象里有类型是java.util.Date类型的属性时,转换出错因为JSON-LIB在转换java.util.Date时调用了Date中一个类似叫getHour的方法但是这个方法里JDK的代码只有一行,直接抛出参数非法异常现在我不知道该怎么办想问问大家有没有什么好办法可以让JSON-LIB转换这个类型的属性

解决方案 »

  1.   

    似乎没有碰到过,
    你说getHour直接抛出异常?
    这似乎不太可能,因为Date.getHour是可以返回正确的数值的。如果json-lib确实有这个问题的话,你是不是可以考虑换一种json的实现?你的stacktrace呢?
      

  2.   

    没有用到Date里面的方法吧,最多用到collection里的
      

  3.   

    好吧同志们,这个问题我现在找到答案了~以前我以为JSON-LIB只是把对象的属性转换一下,变成键值对类型的JSON字符串,现在看来我太小看JSON了在JSON-LIB包里有很多预定义的接口和抽象类我今天解决问题的方式就是用到了一个接口,名字叫:JsonValueProcessor首先,我有一个实体类需要转换
    package testjson;public class Person {
    private String name;

    private int age;

    private String gender; public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public int getAge() {
    return age;
    } public void setAge(int age) {
    this.age = age;
    } public String getGender() {
    return gender;
    } public void setGender(String gender) {
    this.gender = gender;
    }


    }但是我需要转成的格式是 :"姓名-性别-年龄"的格式,而不是类似标准的JSON字符串("name:xx,age:xx,gender:xx")然后写JsonValueProcessor的实现类
    package testjson;import net.sf.json.JsonConfig;
    import net.sf.json.processors.JsonValueProcessor;public class PersonJsonValueProcessor implements JsonValueProcessor { public Object processArrayValue(Object target, JsonConfig jsonConfig) {
    return process(target);
    } public Object processObjectValue(String key, Object target, JsonConfig jsonConfig) {
    return process(target);
    }

    private String process(Object target){
    if(target instanceof Person){
    Person p = (Person)target; 
    return p.getName() + "-" + p.getGender() + "-" + p.getAge(); 
    }else{
    return "";
    }
    }}
    在这个类里,只要processArrayValue或者processObjectValue被调用,都会进到我自己写的process方法里,如果该对象是Person类型的,就按照我想要的格式把字符串拼上然后返回接下来是main方法
    public static void main(String[] args) {
    //准备测试数据
    Map map = new HashMap();
    Person p1 = new Person();
    p1.setName("孙悟空");
    p1.setAge(30);
    p1.setGender("男");

    map.put("person1", p1);

    Person p2 = new Person();
    p2.setName("琪琪");
    p2.setAge(28);
    p2.setGender("女");
    map.put("person2", p2);
    Person p3 = new Person();
    p3.setName("孙悟饭");
    p3.setAge(5);
    p3.setGender("男");
    map.put("person3", p3);                //创建了我自己定义的processor对象
    JsonValueProcessor jsonProcessor = new PersonJsonValueProcessor();

    JsonConfig jsonConfig = new JsonConfig();
    //这步是关键,给JsonConfig注册我自己写的JsonValueProcessor
    jsonConfig.registerJsonValueProcessor(Person.class, jsonProcessor);
    //然后利用JSONSerializer的toJSON方法生成JSON对象,注意参数有2个,第二个就是注册过PersonJsonValueProcessor的JsonConfig
    JSON json = JSONSerializer.toJSON(map, jsonConfig);
                    //生成完毕,打出来看一下
    System.out.println(json.toString());
    }呵呵,有了这个方法,我们想输出什么格式就输出什么格式,转换Date类型更是不在话下好了,就说这么多。回复jinxfei大哥我在公司的电脑里有JDK的源码(貌似是Weblogic8带的JDK1.4),我跟断点进去后发现java.util.Date类的getHour方法(好像是这个名字)是这样写的
    public int getHour(){
         throw new IllegalArgumentsException();
    }
    所以你要的异常堆栈我也没得可给好在我找到了解决方法不过还是很感谢你每次我问你问题的时候你都会很快回复真的很感谢结贴了
      

  4.   

    呵呵,是,这是json留出来的扩展口子。