Skip to content

Map key serialisation broken in version 0.9.22 #181

@mkomadel

Description

@mkomadel

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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions