将json格式的字符串转为对象,其中key-value有将String的日期转为Date类型,怪现象就是,转出来的Date类型的值是当前的系统时间。

网上有许多答案,在反序列化之前需要注册Date解析类型,也就是这段代码:

JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[]{"yyyy-MM-dd"}));

发现并没啥用,最后发现一切的原因都是因为这个方法用错了。

 

仔细看源码,原来在json-lib中一个MorpherRegistry类,所有的转化类型都存在Map morphers中。

在第一次使用JSONObject静态方法时,就会自动注册默认的类型,JSONObject.java中调用了JSONUtils.java,JSONUtils.java源码中有这么一段:

static {
    MorphUtils.registerStandardMorphers(morpherRegistry);
}

在MorphUtils.java代码是:

 1 public class MorphUtils {
 2     public static final BigDecimal BIGDECIMAL_ONE = new BigDecimal("1");
 3     public static final BigDecimal BIGDECIMAL_ZERO = new BigDecimal("0");
 4 
 5     public static void registerStandardMorphers(MorpherRegistry morpherRegistry) {
 6         morpherRegistry.clear();
 7         registerStandardPrimitiveMorphers(morpherRegistry);
 8         registerStandardPrimitiveArrayMorphers(morpherRegistry);
 9         registerStandardObjectMorphers(morpherRegistry);
10         registerStandardObjectArrayMorphers(morpherRegistry);
11     }
12 
13     public static void registerStandardObjectArrayMorphers(MorpherRegistry morpherRegistry) {
14         morpherRegistry.registerMorpher(new ObjectArrayMorpher(new BooleanObjectMorpher(Boolean.FALSE)));
15         morpherRegistry.registerMorpher(new ObjectArrayMorpher(new CharacterObjectMorpher(new Character('\u0000'))));
16         morpherRegistry.registerMorpher(new ObjectArrayMorpher(StringMorpher.getInstance()));
17         morpherRegistry.registerMorpher(new ObjectArrayMorpher(new NumberMorpher(Byte.class, new Byte((byte)0))));
18         morpherRegistry.registerMorpher(new ObjectArrayMorpher(new NumberMorpher(Short.class, new Short((short)0))));
19         morpherRegistry.registerMorpher(new ObjectArrayMorpher(new NumberMorpher(Integer.class, new Integer(0))));
20         morpherRegistry.registerMorpher(new ObjectArrayMorpher(new NumberMorpher(Long.class, new Long(0L))));
21         morpherRegistry.registerMorpher(new ObjectArrayMorpher(new NumberMorpher(Float.class, new Float(0.0F))));
22         morpherRegistry.registerMorpher(new ObjectArrayMorpher(new NumberMorpher(Double.class, new Double(0.0D))));
23         morpherRegistry.registerMorpher(new ObjectArrayMorpher(new NumberMorpher(BigInteger.class, BigInteger.ZERO)));
24         morpherRegistry.registerMorpher(new ObjectArrayMorpher(new NumberMorpher(BigDecimal.class, BIGDECIMAL_ZERO)));
25         morpherRegistry.registerMorpher(new ObjectArrayMorpher(ClassMorpher.getInstance()));
26     }
27 
28     public static void registerStandardObjectMorphers(MorpherRegistry morpherRegistry) {
29         morpherRegistry.registerMorpher(new BooleanObjectMorpher(Boolean.FALSE));
30         morpherRegistry.registerMorpher(new CharacterObjectMorpher(new Character('\u0000')));
31         morpherRegistry.registerMorpher(StringMorpher.getInstance());
32         morpherRegistry.registerMorpher(new NumberMorpher(Byte.class, new Byte((byte)0)));
33         morpherRegistry.registerMorpher(new NumberMorpher(Short.class, new Short((short)0)));
34         morpherRegistry.registerMorpher(new NumberMorpher(Integer.class, new Integer(0)));
35         morpherRegistry.registerMorpher(new NumberMorpher(Long.class, new Long(0L)));
36         morpherRegistry.registerMorpher(new NumberMorpher(Float.class, new Float(0.0F)));
37         morpherRegistry.registerMorpher(new NumberMorpher(Double.class, new Double(0.0D)));
38         morpherRegistry.registerMorpher(new NumberMorpher(BigInteger.class, BigInteger.ZERO));
39         morpherRegistry.registerMorpher(new NumberMorpher(BigDecimal.class, BIGDECIMAL_ZERO));
40         morpherRegistry.registerMorpher(ClassMorpher.getInstance());
41     }
42 
43     public static void registerStandardPrimitiveArrayMorphers(MorpherRegistry morpherRegistry) {
44         morpherRegistry.registerMorpher(new BooleanArrayMorpher(false));
45         morpherRegistry.registerMorpher(new CharArrayMorpher('\u0000'));
46         morpherRegistry.registerMorpher(new ByteArrayMorpher((byte)0));
47         morpherRegistry.registerMorpher(new ShortArrayMorpher((short)0));
48         morpherRegistry.registerMorpher(new IntArrayMorpher(0));
49         morpherRegistry.registerMorpher(new LongArrayMorpher(0L));
50         morpherRegistry.registerMorpher(new FloatArrayMorpher(0.0F));
51         morpherRegistry.registerMorpher(new DoubleArrayMorpher(0.0D));
52     }
53 
54     public static void registerStandardPrimitiveMorphers(MorpherRegistry morpherRegistry) {
55         morpherRegistry.registerMorpher(new BooleanMorpher(false));
56         morpherRegistry.registerMorpher(new CharMorpher('\u0000'));
57         morpherRegistry.registerMorpher(new ByteMorpher((byte)0));
58         morpherRegistry.registerMorpher(new ShortMorpher((short)0));
59         morpherRegistry.registerMorpher(new IntMorpher(0));
60         morpherRegistry.registerMorpher(new LongMorpher(0L));
61         morpherRegistry.registerMorpher(new FloatMorpher(0.0F));
62         morpherRegistry.registerMorpher(new DoubleMorpher(0.0D));
63     }
64 
65     private MorphUtils() {
66     }
67 }
View Code

相关文章: