From e21a29ffb7fee179e61ae5c6c46d4a88377bdf9e Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Sat, 24 Feb 2018 21:39:26 +0800 Subject: [PATCH] fix #154 support map of integer typed key --- src/main/java/com/jsoniter/CodegenAccess.java | 6 +++++- src/main/java/com/jsoniter/output/CodegenImplMap.java | 2 ++ src/main/java/com/jsoniter/output/MapKeyEncoders.java | 4 ++++ src/test/java/com/jsoniter/TestMap.java | 5 +++-- src/test/java/com/jsoniter/output/TestGenerics.java | 2 +- src/test/java/com/jsoniter/output/TestMap.java | 2 +- 6 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/jsoniter/CodegenAccess.java b/src/main/java/com/jsoniter/CodegenAccess.java index b20f5200..bc4f3cb7 100644 --- a/src/main/java/com/jsoniter/CodegenAccess.java +++ b/src/main/java/com/jsoniter/CodegenAccess.java @@ -143,7 +143,11 @@ public static final Slice readSlice(JsonIterator iter) throws IOException { public static final Object readMapKey(String cacheKey, JsonIterator iter) throws IOException { Decoder mapKeyDecoder = JsoniterSpi.getMapKeyDecoder(cacheKey); - return mapKeyDecoder.decode(iter); + Object key = mapKeyDecoder.decode(iter); + if (IterImpl.nextToken(iter) != ':') { + throw iter.reportError("readMapKey", "expect :"); + } + return key; } final static boolean skipWhitespacesWithoutLoadMore(JsonIterator iter) throws IOException { diff --git a/src/main/java/com/jsoniter/output/CodegenImplMap.java b/src/main/java/com/jsoniter/output/CodegenImplMap.java index a2d9d16d..52250efd 100644 --- a/src/main/java/com/jsoniter/output/CodegenImplMap.java +++ b/src/main/java/com/jsoniter/output/CodegenImplMap.java @@ -81,7 +81,9 @@ private static void genWriteMapKey(CodegenResult ctx, Type keyType, boolean noIn if (keyType == String.class) { ctx.append("stream.writeVal((java.lang.String)entry.getKey());"); } else if (CodegenImplNative.NATIVE_ENCODERS.containsKey(keyType)) { + ctx.append("stream.write('\"');"); ctx.append(String.format("stream.writeVal((%s)entry.getKey());", CodegenImplNative.getTypeName(keyType))); + ctx.append("stream.write('\"');"); } else { String mapCacheKey = JsoniterSpi.getMapKeyEncoderCacheKey(keyType); ctx.append(String.format("com.jsoniter.output.CodegenAccess.writeMapKey(\"%s\", entry.getKey(), stream);", mapCacheKey)); diff --git a/src/main/java/com/jsoniter/output/MapKeyEncoders.java b/src/main/java/com/jsoniter/output/MapKeyEncoders.java index cbdc1cca..443aa291 100644 --- a/src/main/java/com/jsoniter/output/MapKeyEncoders.java +++ b/src/main/java/com/jsoniter/output/MapKeyEncoders.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.lang.reflect.Type; +import java.lang.reflect.WildcardType; class MapKeyEncoders { @@ -25,6 +26,9 @@ private static Encoder createDefaultEncoder(Type mapKeyType) { 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); diff --git a/src/test/java/com/jsoniter/TestMap.java b/src/test/java/com/jsoniter/TestMap.java index 4b13731f..f9becb56 100644 --- a/src/test/java/com/jsoniter/TestMap.java +++ b/src/test/java/com/jsoniter/TestMap.java @@ -1,7 +1,9 @@ package com.jsoniter; import com.jsoniter.extra.GsonCompatibilityMode; -import com.jsoniter.spi.*; +import com.jsoniter.spi.Decoder; +import com.jsoniter.spi.JsoniterSpi; +import com.jsoniter.spi.TypeLiteral; import junit.framework.TestCase; import java.io.IOException; @@ -66,5 +68,4 @@ public Object decode(JsonIterator iter) throws IOException { assertEquals(1, keys.size()); assertEquals(100, keys.get(0).Field); } - } diff --git a/src/test/java/com/jsoniter/output/TestGenerics.java b/src/test/java/com/jsoniter/output/TestGenerics.java index 53d5a95a..ff06d780 100644 --- a/src/test/java/com/jsoniter/output/TestGenerics.java +++ b/src/test/java/com/jsoniter/output/TestGenerics.java @@ -41,7 +41,7 @@ public void test_inherited_getter_is_not_duplicate() throws IOException { public static class TestObject7 { public List field; - public Map field2; + public Map field2; } public void test_wildcard() throws IOException { diff --git a/src/test/java/com/jsoniter/output/TestMap.java b/src/test/java/com/jsoniter/output/TestMap.java index edd515ef..3b7aa5e4 100644 --- a/src/test/java/com/jsoniter/output/TestMap.java +++ b/src/test/java/com/jsoniter/output/TestMap.java @@ -128,7 +128,7 @@ public void test_int_as_map_key() { }, m)); } - public void test_int_obj_as_map_key() { + public void test_object_key() { HashMap m = new HashMap(); m.put(1, 2); assertEquals("{\"1\":2}", JsonStream.serialize(m));