11package com .jsoniter ;
22
3+ import com .jsoniter .spi .TypeLiteral ;
4+
35import java .lang .reflect .Type ;
46import java .util .HashMap ;
57import java .util .Map ;
68
79class CodegenImplMap {
810
911 public static String genMap (Class clazz , Type [] typeArgs ) {
12+ Type keyType = typeArgs [0 ];
13+ MapKeyDecoders .register (keyType );
1014 Type valueType = typeArgs [1 ];
1115 StringBuilder lines = new StringBuilder ();
1216 append (lines , "{{clazz}} map = ({{clazz}})com.jsoniter.CodegenAccess.resetExistingObject(iter);" );
@@ -16,11 +20,18 @@ public static String genMap(Class clazz, Type[] typeArgs) {
1620 append (lines , "return map;" );
1721 append (lines , "}" );
1822 append (lines , "do {" );
19- append (lines , "String field = com.jsoniter.CodegenAccess.readObjectFieldAsString(iter);" );
20- append (lines , "map.put(field, {{op}});" );
23+ if (keyType == String .class ) {
24+ append (lines , "Object mapKey = com.jsoniter.CodegenAccess.readObjectFieldAsString(iter);" );
25+ } else {
26+ append (lines , "Object mapKey = com.jsoniter.CodegenAccess.readMapKey(\" " +
27+ TypeLiteral .create (keyType ).getDecoderCacheKey () +"\" , iter);" );
28+ }
29+ append (lines , "map.put(mapKey, {{op}});" );
2130 append (lines , "} while (com.jsoniter.CodegenAccess.nextToken(iter) == ',');" );
2231 append (lines , "return map;" );
23- return lines .toString ().replace ("{{clazz}}" , clazz .getName ()).replace ("{{op}}" , CodegenImplNative .genReadOp (valueType ));
32+ return lines .toString ()
33+ .replace ("{{clazz}}" , clazz .getName ())
34+ .replace ("{{op}}" , CodegenImplNative .genReadOp (valueType ));
2435 }
2536
2637 private static void append (StringBuilder lines , String str ) {
0 commit comments