将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 }