How do I handle newlines in JSON?

How do I handle newlines in JSON?

I’ve generated some JSON and I’m trying to pull it into an object in JavaScript. I keep getting errors. Here’s what I have
var data = ‘{“count” : 1, “stack” : “sometext\n\n”}’;
var dataObj = eval(‘(‘+data+’)’);

This gives me an error
unterminated string literal

With JSON.parse(data), I see similar error messages: “Unexpected token ↵” in Chrome, and “unterminated string literal” in Firefox and IE.
When I take out the \n after sometext the error goes away in both cases. I can’t seem to figure out why the \n makes eval and JSON.parse fail.


Solution 1:

I guess this is what you want:

var data = '{"count" : 1, "stack" : "sometext\\n\\n"}';

(You need to escape the “\” in your string (turning it into a double-“\”), otherwise it will become a newline in the JSON source, not the JSON data.)

Solution 2:

You will need to have a function which replaces \n to \\n in case data is not a string literal.

function jsonEscape(str)  {
    return str.replace(/\n/g, "\\\\n").replace(/\r/g, "\\\\r").replace(/\t/g, "\\\\t");

var data = '{"count" : 1, "stack" : "sometext\n\n"}';
var dataObj = JSON.parse(jsonEscape(data));

Resulting dataObj will be

Object {count: 1, stack: "sometext\n\n"}

Solution 3:

According to spec:

A string is a sequence of Unicode code points wrapped with quotation marks
(U+0022). All characters may be placed within the quotation marks except for the
characters that must be escaped: quotation mark (U+0022), reverse solidus
(U+005C), and the control characters U+0000 to U+001F. There are two-character
escape sequence representations of some characters.

So you can’t pass 0x0A or 0x0C codes directly. It is forbidden! Spec suggests to use escape sequences for some well defined codes from U+0000 to U+001F:

\f  represents the form feed character (U+000C). 
\n  represents the line feed character (U+000A).

As most of programming languages uses \ for quoting you should escape escape syntax (double-escape – once for language/platform, once for Json itself):

jsonStr = "{ \"name\": \"Multi\\nline.\" }";

Solution 4:

You could just escape your string in the server when writing the value of the json field and unescape it when retrieving the value in the client browser, for instance.

Related:  Javascript add method to object

The javascript implementation of all major browser have the unescape command.

in the server:

response.write "{""field1"":""" & escape(RS_Temp("textField")) & """}"

in the browser:

document.getElementById("text1").value = unescape(jsonObject.field1)

Solution 5:

You might want to look into this C# function to escape the string:

public static string Enquote(string s)  
    if (s == null || s.Length == 0)  
        return "\"\""; 
    char         c; 
    int          i; 
    int          len = s.Length; 
    StringBuilder sb = new StringBuilder(len + 4); 
    string       t; 

    for (i = 0; i < len; i += 1)  
        c = s[i]; 
        if ((c == '\\') || (c == '"') || (c == '>')) 
        else if (c == '\b') 
        else if (c == '\t') 
        else if (c == '\n') 
        else if (c == '\f') 
        else if (c == '\r') 
            if (c < ' ')  
                //t = "000" + Integer.toHexString(c); 
                string t = new string(c,1); 
                t = "000" + int.Parse(tmp,System.Globalization.NumberStyles.HexNumber); 
                sb.Append("\\u" + t.Substring(t.Length - 4)); 
    return sb.ToString(); 

Solution 6:

Hi i used this function to strip newline or other chars in data to parse JSON data:

function normalize_str($str) {

    $invalid = array('Š'=>'S', 'š'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z', 'ž'=>'z',
    'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A',
    'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E',
    'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O',
    'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y',
    'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a',
    'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e',  'ë'=>'e', 'ì'=>'i', 'í'=>'i',
    'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o',
    'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y',  'ý'=>'y', 'þ'=>'b',
    'ÿ'=>'y', 'Ŕ'=>'R', 'ŕ'=>'r', "`" => "'", "´" => "'", '"' => ',', '`' => "'",
    '´' => "'", '"' => '\"', '"' => "\"", '´' => "'", "&acirc;€™" => "'", "{" => "",
    "~" => "", "–" => "-", "'" => "'","     " => " ");

    $str = str_replace(array_keys($invalid), array_values($invalid), $str);

    $remove = array("\n", "\r\n", "\r");
    $str = str_replace($remove, "\\n", trim($str));

      //$str = htmlentities($str,ENT_QUOTES);

    return htmlspecialchars($str);

echo normalize_str($lst['address']);