Кодирование / экранирование управляющих символов JSON

Я использую COLUMN_JSON() MariaDB. Как показывает эта ошибка , функция должным образом избегает двойных кавычек, но не других символов, которые должны быть закодированы / экранированы.

Вот глупый пример запроса, чтобы продемонстрировать, как создается столбец JSON.

 SELECT CONCAT('[', GROUP_CONCAT(COLUMN_JSON(COLUMN_CREATE( 'name', `name`, 'value', `value` )) SEPARATOR ','), ']') AS `json` FROM `settings` 

Если name или value содержат недопустимые символы JSON, json_decode завершится с ошибкой.

Я написал функцию PHP, чтобы вывести / закодировать значение, которое приходит из запроса, но похоже, что должен быть лучший способ.

 /** * Makes sure the JSON values built by COLUMN_JSON() in MariaDB are safe for json_decode() * Assumes that double quotes are already escaped * * @param string $mysql_json * @return string */ public static function jsonEscape($mysql_json) { $rtn = ''; for ($i = 0; $i < strlen($mysql_json); ++$i) { $char = $mysql_json[$i]; if (($char === '\\') && ($mysql_json[$i + 1] !== '"')) { // escape a backslash, but leave escaped double quotes intact $rtn .= '\\\\'; } elseif (($ord = ord($char)) && ($ord < 32)) { // hex encode control characters (below ASCII 32) $rtn .= '\\u' . str_pad(dechex($ord), 4, '0', STR_PAD_LEFT); } else { $rtn .= $char; } } return $rtn; } 

Осмотрите строку по-символу, как это не работает хорошо. Возможно, есть замена строки или регулярное выражение, которое будет более результативным?

Related of "Кодирование / экранирование управляющих символов JSON"