Redis

JSON.SET 的字符串为什么要写两层引号

shell
JSON.SET product:1 $.name '"Striped Bowtie"'

两层引号各管各的:

  • 外层单引号给 shell / redis-cli:只是让空格不把参数拆开,发到服务器前就被剥掉了。
  • 内层双引号给 JSON:服务器收到的是 "Striped Bowtie" 这一串字节。

能不能省成一层?不能。Redis 的参数只有字节、没有类型,JSON.SET 规定这个参数是一段 JSON 文本。不加内层引号,服务器分不清 42、true、null 是数字、布尔、空值还是字符串:

shell
JSON.SET p $.n '42'      # 数字 42
JSON.SET p $.s '"42"'    # 字符串 "42"

如果规定「解析失败就当字符串」,写坏的 JSON(比如 {"a":1)会被悄悄存成一个字符串,更难排查。

MySQL 的 JSON_SET 只要一层引号,是因为 SQL 字面量本身就带类型。

esc