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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions