diff --git a/src/core/lib/json/json_reader.c b/src/core/lib/json/json_reader.c
index 098e089eed44fb643e4602b618f25eefd7d94eae..9e18135b328db12ac896a89f789221a3a44ea45f 100644
--- a/src/core/lib/json/json_reader.c
+++ b/src/core/lib/json/json_reader.c
@@ -202,8 +202,10 @@ grpc_json_reader_status grpc_json_reader_run(grpc_json_reader *reader) {
               }
               if (reader->in_object) {
                 reader->state = GRPC_JSON_STATE_OBJECT_KEY_BEGIN;
-              } else {
+              } else if (reader->in_array) {
                 reader->state = GRPC_JSON_STATE_VALUE_BEGIN;
+              } else {
+                return GRPC_JSON_PARSE_ERROR;
               }
             } else {
               if (reader->depth-- == 0) return GRPC_JSON_PARSE_ERROR;
diff --git a/test/core/json/json_test.c b/test/core/json/json_test.c
index 735ff4c853241db715e606e0889027ca9ae5f612..7ea5caca5b1fe3257850aa30b7a5956d73d7c12d 100644
--- a/test/core/json/json_test.c
+++ b/test/core/json/json_test.c
@@ -90,6 +90,7 @@ static testing_pair testing_pairs[] = {
     {"{\"foo\": bar\"x\"}", NULL},
     {"fals", NULL},
     {"0,0 ", NULL},
+    {"\"foo\",[]", NULL},
     /* Testing unterminated string. */
     {"\"\\x", NULL},
     /* Testing invalid UTF-16 number. */