【问题标题】:Escaping special characters while storing JSON as string in Redis在 Redis 中将 JSON 存储为字符串时转义特殊字符
【发布时间】:2016-01-27 02:48:18
【问题描述】:

我正在尝试通过 PHP 将 JSON 数据存储在 Redis 中,但通过 redis-cli 命令行客户端对其进行测试。

在这两个客户端中,我似乎无法在不以某种方式转义的情况下存储 JSON。

redis 127.0.0.1:6379> set test1 {"array":[1,2,3],"number":123,"object":{"a":"b","c":"d","e":"f"},"string":"Hello World"}
Invalid argument(s)

没用。

redis 127.0.0.1:6379> set test1 '{"array":[1,2,3],"number":123,"object":{"a":"b","c":"d","e":"f"},"string":"Hello World"}'
Invalid argument(s)

试过单引号。不工作。

redis 127.0.0.1:6379> set test1 \{\"array\"\:\[1\,2\,3\]\,\"number\"\:123\,\"object\"\:\{\"a\"\:\"b\"\,\"c\"\:\"d\"\,\"e\"\:\"f\"\},\"string\"\:\"Hello World\"\}
Invalid argument(s)

尝试使用反斜杠转义所有内容。不工作。

redis 127.0.0.1:6379> "\{\"array\"\:\[1\,2\,3\]\,\"number\"\:123\,\"object\"\:\{\"a\"\:\"b\"\,\"c\"\:\"d\"\,\"e\"\:\"f\"\},\"string\"\:\"Hello World\"\}"
OK

尝试用反斜杠和双引号转义所有内容。

而且有效!

redis 127.0.0.1:6379> get test1
"{\"array\":[1,2,3],\"number\":123,\"object\":{\"a\":\"b\",\"c\":\"d\",\"e\":\"f\"},\"string\":\"Hello World\"}"

现在在 serialize() 或 json_encode() 中有一个简单的参数可以让这自动发生,

我必须使用 preg_replace() 编写一个自定义函数,以便在存储时添加斜杠,然后在检索时删除斜杠,并希望没有特定的棘手数据会破坏我基于自定义正则表达式的代码。

如果有合适的方法,我觉得第二种选择确实不可取。

你知道这样的选择是什么吗?

我无法使用 Predis(我尝试了 https://github.com/nrk/predis/tree/php5.2_backport,因为我正在使用 PHP 5.2),但后来发现 https://github.com/joelcox/codeigniter-redis 它适用于所有基本数据类型。

那么,serialize() / json_encode() 的选项/参数是什么,它将允许 redis-cli 不会拒绝的字符串?

【问题讨论】:

  • 我现在没有在任何地方运行 redis 来测试,但如果有帮助的话,我可以告诉你,我从来没有经历过这样的扭曲。尝试设置简单的字符串并努力查看测试数据的哪一部分正在扼杀你。
  • 然后我很好奇,我安装了 redis,你的测试的单引号版本对我来说效果很好。
  • @Jerry:感谢您的回答。问题出在 command() 函数中。请参阅下面的答案。

标签: php json codeigniter redis redis-cli


【解决方案1】:

嗯,原来是第 118 行 https://github.com/joelcox/codeigniter-redis/blob/develop/libraries/Redis.php

public function command($string)
{
    $slices = explode(' ', $string); /* <-- HERE  */
    $request = $this->_encode_request($slices[0], array_slice($slices, 1));
    return $this->_write_request($request);
}

是用空格字符盲目地分割整个命令。

由于我的数据中有空格(现实世界的数据没有……),这违反了 Redis CLI 语法。

所以我必须转义空格(由自定义字符串替换)才能使其正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-01
    • 2013-10-11
    • 2013-09-08
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2019-02-17
    相关资源
    最近更新 更多