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<Integer, Integer> m = new HashMap<Integer, Integer>();
         m.put(1, 2);
         assertEquals("{\"1\":2}", JsonStream.serialize(m));