Экранирование специальных символов при сохранении JSON в виде строки в Redis

Я пытаюсь сохранить данные JSON в Redis через PHP, но тестирую их через клиент командной строки 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 не отклонит?

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.

Поэтому мне пришлось экранировать пробелы (заменяемые пользовательской строкой), чтобы заставить его работать должным образом.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]