-
Notifications
You must be signed in to change notification settings - Fork 526
Description
Hi,
I am serialising Map with enum as a key. In version 0.9.21 this enum is serialised using toString() method and everything works. Updating to version 0.9.22 breaks this and I following exception
com.jsoniter.spi.JsonException: can not encode map key type: class constants.Image$Size at com.jsoniter.output.MapKeyEncoders.createDefaultEncoder(MapKeyEncoders.java:36) at com.jsoniter.output.MapKeyEncoders.registerOrGetExisting(MapKeyEncoders.java:17) at com.jsoniter.output.Codegen.gen(Codegen.java:82) at com.jsoniter.output.Codegen.getEncoder(Codegen.java:49) at com.jsoniter.output.CodegenImplNative.genWriteOp(CodegenImplNative.java:295) at com.jsoniter.output.CodegenImplNative.genWriteOp(CodegenImplNative.java:269) at com.jsoniter.output.CodegenImplArray.genList(CodegenImplArray.java:113) at com.jsoniter.output.CodegenImplArray.genCollection(CodegenImplArray.java:30) at com.jsoniter.output.Codegen.genSource(Codegen.java:222) at com.jsoniter.output.Codegen.gen(Codegen.java:98) at com.jsoniter.output.Codegen.getEncoder(Codegen.java:49) at com.jsoniter.output.CodegenImplNative.genWriteOp(CodegenImplNative.java:295) at com.jsoniter.output.CodegenImplObject.genField(CodegenImplObject.java:117) at com.jsoniter.output.CodegenImplObject.genObject(CodegenImplObject.java:22) at com.jsoniter.output.Codegen.genSource(Codegen.java:227) at com.jsoniter.output.Codegen.gen(Codegen.java:98) at com.jsoniter.output.Codegen.getEncoder(Codegen.java:49) at com.jsoniter.output.CodegenImplNative.genWriteOp(CodegenImplNative.java:295) at com.jsoniter.output.CodegenImplNative.genWriteOp(CodegenImplNative.java:269) at com.jsoniter.output.CodegenImplArray.genList(CodegenImplArray.java:113) at com.jsoniter.output.CodegenImplArray.genCollection(CodegenImplArray.java:30) at com.jsoniter.output.Codegen.genSource(Codegen.java:222) at com.jsoniter.output.Codegen.gen(Codegen.java:98) at com.jsoniter.output.Codegen.getEncoder(Codegen.java:49) at com.jsoniter.output.CodegenImplNative.genWriteOp(CodegenImplNative.java:295) at com.jsoniter.output.CodegenImplObject.genField(CodegenImplObject.java:117) at com.jsoniter.output.CodegenImplObject.genObject(CodegenImplObject.java:22) at com.jsoniter.output.Codegen.genSource(Codegen.java:227) at com.jsoniter.output.Codegen.gen(Codegen.java:98) at com.jsoniter.output.Codegen.getEncoder(Codegen.java:49) at com.jsoniter.output.JsonStream.writeVal(JsonStream.java:362) at com.jsoniter.output.JsonStream.serialize(JsonStream.java:408)
without much investigation I suppose the problem is in class com.jsoniter.output.MapKeyEncoders# createDefaultEncoder(Type mapKeyType)
`
private static Encoder createDefaultEncoder(Type mapKeyType) {
if (mapKeyType == String.class) {
return new StringKeyEncoder();
}
if (mapKeyType == Object.class) {
return new DynamicKeyEncoder();
}
if (mapKeyType instanceof WildcardType) {
return new DynamicKeyEncoder();
}
Encoder.ReflectionEncoder encoder = CodegenImplNative.NATIVE_ENCODERS.get(mapKeyType);
if (encoder != null) {
return new NumberKeyEncoder(encoder);
}
throw new JsonException("can not encode map key type: " + mapKeyType);
}
`
I think this should be in the end of the method
if (mapKeyType instanceof Object.class) { return new DynamicKeyEncoder(); }
without throwing any exception (notice change == for instanceof).