Skip to content

Commit 2581901

Browse files
committed
support object map key type in codegen
1 parent 9f5b119 commit 2581901

File tree

3 files changed

+30
-19
lines changed

3 files changed

+30
-19
lines changed

src/main/java/com/jsoniter/output/CodegenImplMap.java

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ public static CodegenResult genMap(String cacheKey, ClassInfo classInfo) {
1919
keyType = typeArgs[0];
2020
valueType = typeArgs[1];
2121
}
22-
String mapCacheKey = JsoniterSpi.getMapKeyEncoderCacheKey(keyType);
2322
CodegenResult ctx = new CodegenResult();
2423
ctx.append("public static void encode_(java.lang.Object obj, com.jsoniter.output.JsonStream stream) throws java.io.IOException {");
2524
ctx.append("if (obj == null) { stream.writeNull(); return; }");
@@ -36,16 +35,7 @@ public static CodegenResult genMap(String cacheKey, ClassInfo classInfo) {
3635
} else {
3736
ctx.append("stream.writeObjectStart(); stream.writeIndention();");
3837
}
39-
if (keyType == String.class) {
40-
ctx.append("stream.writeVal((java.lang.String)entry.getKey());");
41-
} else {
42-
ctx.append(String.format("com.jsoniter.output.CodegenAccess.writeMapKey(\"%s\", entry.getKey(), stream);", mapCacheKey));
43-
}
44-
if (noIndention) {
45-
ctx.append("stream.write(':');");
46-
} else {
47-
ctx.append("stream.write((byte)':', (byte)' ');");
48-
}
38+
genWriteMapKey(ctx, keyType, noIndention);
4939
if (isCollectionValueNullable) {
5040
ctx.append("if (entry.getValue() == null) { stream.writeNull(); } else {");
5141
CodegenImplNative.genWriteOp(ctx, "entry.getValue()", valueType, true);
@@ -60,11 +50,7 @@ public static CodegenResult genMap(String cacheKey, ClassInfo classInfo) {
6050
} else {
6151
ctx.append("stream.writeMore();");
6252
}
63-
if (keyType == String.class) {
64-
ctx.append("stream.writeVal((java.lang.String)entry.getKey());");
65-
} else {
66-
ctx.append(String.format("com.jsoniter.output.CodegenAccess.writeMapKey(\"%s\", entry.getKey(), stream);", mapCacheKey));
67-
}
53+
genWriteMapKey(ctx, keyType, noIndention);
6854
if (noIndention) {
6955
ctx.append("stream.write(':');");
7056
} else {
@@ -86,4 +72,24 @@ public static CodegenResult genMap(String cacheKey, ClassInfo classInfo) {
8672
ctx.append("}");
8773
return ctx;
8874
}
75+
76+
private static void genWriteMapKey(CodegenResult ctx, Type keyType, boolean noIndention) {
77+
if (keyType == Object.class) {
78+
ctx.append("stream.writeObjectField(entry.getKey());");
79+
return;
80+
}
81+
if (keyType == String.class) {
82+
ctx.append("stream.writeVal((java.lang.String)entry.getKey());");
83+
} else if (CodegenImplNative.NATIVE_ENCODERS.containsKey(keyType)) {
84+
ctx.append(String.format("stream.writeVal((%s)entry.getKey());", CodegenImplNative.getTypeName(keyType)));
85+
} else {
86+
String mapCacheKey = JsoniterSpi.getMapKeyEncoderCacheKey(keyType);
87+
ctx.append(String.format("com.jsoniter.output.CodegenAccess.writeMapKey(\"%s\", entry.getKey(), stream);", mapCacheKey));
88+
}
89+
if (noIndention) {
90+
ctx.append("stream.write(':');");
91+
} else {
92+
ctx.append("stream.write((byte)':', (byte)' ');");
93+
}
94+
}
8995
}

src/main/java/com/jsoniter/output/JsonStream.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,11 @@ public final void writeObjectField(String field) throws IOException {
331331
}
332332
}
333333

334+
public final void writeObjectField(Object key) throws IOException {
335+
Encoder encoder = MapKeyEncoders.registerOrGetExisting(key.getClass());
336+
writeObjectField(key, encoder);
337+
}
338+
334339
public final void writeObjectField(Object key, Encoder keyEncoder) throws IOException {
335340
keyEncoder.encode(key, this);
336341
if (indention > 0) {

src/test/java/com/jsoniter/output/TestMap.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,9 @@ public void test_indention_with_empty_map() {
122122
}
123123

124124
public void test_int_as_map_key() {
125-
HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();
126-
m.put(1, 2);
127-
assertEquals("{\"1\":2}", JsonStream.serialize(new TypeLiteral<Map<Integer, Integer>>(){
125+
HashMap<Integer, String> m = new HashMap<Integer, String>();
126+
m.put(1, "2");
127+
assertEquals("{\"1\":\"2\"}", JsonStream.serialize(new TypeLiteral<Map<Integer, String>>() {
128128
}, m));
129129
}
130130

0 commit comments

Comments
 (0)