From 8deb9a4f1e8f65969f4678035080ae3c380e82f9 Mon Sep 17 00:00:00 2001 From: Yuta Hongo Date: Wed, 5 Jan 2022 00:24:29 +0900 Subject: [PATCH] Stringify JSON key of --json option result (#10046) About RESP3 an ordered collection of key-value pairs, keys and value can be any other RESP3 type, but a key should be string in JSON spec. --- src/redis-cli.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/redis-cli.c b/src/redis-cli.c index 9ec5ecfa9..8ef67f67a 100644 --- a/src/redis-cli.c +++ b/src/redis-cli.c @@ -1192,8 +1192,18 @@ static sds cliFormatReplyJson(sds out, redisReply *r) { case REDIS_REPLY_MAP: out = sdscat(out,"{"); for (i = 0; i < r->elements; i += 2) { - out = cliFormatReplyJson(out, r->element[i]); - + redisReply *key = r->element[i]; + if (key->type == REDIS_REPLY_STATUS || + key->type == REDIS_REPLY_STRING || + key->type == REDIS_REPLY_VERB) { + out = cliFormatReplyJson(out, key); + } else { + /* According to JSON spec, JSON map keys must be strings, */ + /* and in RESP3, they can be other types. */ + sds tmp = cliFormatReplyJson(sdsempty(), key); + out = sdscatrepr(out,tmp,sdslen(tmp)); + sdsfree(tmp); + } out = sdscat(out,":"); out = cliFormatReplyJson(out, r->element[i+1]);