Problem when retrieving text in JSON format containing line breaks with jQuery
If you would like to keep the line breaks, you might try:
function parse($text) { // Damn pesky carriage returns... $text = str_replace("\r\n", "\n", $text); $text = str_replace("\r", "\n", $text); // JSON requires new line characters be escaped $text = str_replace("\n", "\\n", $text); return $text;}
Line breaks aren't the issue so much as they need to be properly escaped in JSON. If it's available to you, you can use json_encode which automatically escapes newlines. Failing that, you can use something like Pim Jager's method above, though a proper JSON encoder would be best.
I encountered that problem while making a class in PHP4 to emulate json_encode (available in PHP5). Here's what i came up with :
class jsonResponse { var $response; function jsonResponse() { $this->response = array('isOK'=>'KO','msg'=>'Undefined'); } function set($isOK, $msg) { $this->response['isOK'] = ($isOK) ? 'OK' : 'KO'; $this->response['msg'] = htmlentities($msg); } function setData($data=null) { if(!is_null($data)) $this->response['data'] = $data; elseif(isset($this->response['data'])) unset($this->response['data']); } function send() { header('Content-type: application/json'); echo '{"isOK":"'.$this->response['isOK'].'","msg":'.$this->parseString($this->response['msg']); if(isset($this->response['data'])) echo ',"data":'.$this->parseData($this->response['data']); echo '}'; } function parseData($data) { if(is_array($data)) { $parsed = array(); foreach ($data as $key=>$value) array_push($parsed, $this->parseString($key).':'.$this->parseData($value)); return '{'.implode(',', $parsed).'}'; } else return $this->parseString($data); } function parseString($string) { $string = str_replace("\\", "\\\\", $string); $string = str_replace('/', "\\/", $string); $string = str_replace('"', "\\".'"', $string); $string = str_replace("\b", "\\b", $string); $string = str_replace("\t", "\\t", $string); $string = str_replace("\n", "\\n", $string); $string = str_replace("\f", "\\f", $string); $string = str_replace("\r", "\\r", $string); $string = str_replace("\u", "\\u", $string); return '"'.$string.'"'; }}
I followed the rules mentionned here.I only used what i needed but i figure that you can adapt it to your needs in the language your are using. The problem in my case wasn't about newlines as i originally thought but about the / not being escaped. I hope this prevent someone else from the little headache i had figuring out what i did wrong.