Question

J'ai généré du JSON et j'essaie de l'intégrer dans un objet en JavaScript.Je continue à recevoir des erreurs.Voici ce que j'ai

var data = '{"count" : 1, "stack" : "sometext\n\n"}';
var dataObj = eval('('+data+')');

Cela me donne une erreur

unterminated string literal

Avec JSON.parse(data), je vois des messages d'erreur similaires :"Unexpected token ↵" dans Chrome et "unterminated string literal" dans Firefox et IE.

Quand je sors le \n après sometext l'erreur disparaît dans les deux cas.Je n'arrive pas à comprendre pourquoi le \n fait du eval et JSON.parse échouer.

Était-ce utile?

La solution

Je suppose que c'est ce que tu veux :

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

(Vous devez échapper le "\" dans votre chaîne (en le transformant en double-"\"), sinon il deviendra une nouvelle ligne dans la source JSON, pas les données JSON.)

Autres conseils

Vous aurez besoin d'une fonction qui remplace \n à \\n au cas où data n'est pas une chaîne littérale.

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));

Résultat dataObj sera

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

Selon les spécifications : http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf

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.

Donc tu ne peux pas passer 0x0A ou 0x0C codes directement.C'est interdit!Spec suggère d'utiliser des séquences d'échappement pour certains codes bien définis de U+0000 à U+001F:

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

Comme la plupart des langages de programmation utilisent \ pour citer, vous devez échapper à la syntaxe d'échappement (double échappement - une fois pour le langage/la plate-forme, une fois pour Json lui-même) :

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

Vous pouvez simplement échapper votre chaîne sur le serveur lors de l'écriture de la valeur du champ json et la supprimer lors de la récupération de la valeur dans le navigateur client, par exemple.

L'implémentation javascript de tous les principaux navigateurs utilise la commande unescape.

Exemple:sur le serveur :

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

dans le navigateur :

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

Vous souhaiterez peut-être examiner cette fonction C# pour échapper à la chaîne :

http://www.aspcode.net/C-encode-a-string-for-JSON-JavaScript.aspx

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; 

    sb.Append('"'); 
    for (i = 0; i < len; i += 1)  
    { 
        c = s[i]; 
        if ((c == '\\') || (c == '"') || (c == '>')) 
        { 
            sb.Append('\\'); 
            sb.Append(c); 
        } 
        else if (c == '\b') 
            sb.Append("\\b"); 
        else if (c == '\t') 
            sb.Append("\\t"); 
        else if (c == '\n') 
            sb.Append("\\n"); 
        else if (c == '\f') 
            sb.Append("\\f"); 
        else if (c == '\r') 
            sb.Append("\\r"); 
        else 
        { 
            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)); 
            }  
            else  
            { 
                sb.Append(c); 
            } 
        } 
    } 
    sb.Append('"'); 
    return sb.ToString(); 
} 

Bonjour, j'ai utilisé cette fonction pour supprimer les nouvelles lignes ou d'autres caractères dans les données afin d'analyser les données JSON :

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']);

J'ai rencontré ce problème lors de la création d'une classe en PHP4 pour émuler json_encode (disponible en PHP5).Voici ce que j'ai trouvé :

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.'"';
    }
}

J'ai suivi les règles mentionnées ici.Je n'ai utilisé que ce dont j'avais besoin mais je pense que vous pouvez l'adapter à vos besoins dans la langue que vous utilisez.Le problème dans mon cas ne concernait pas les nouvelles lignes comme je le pensais au départ, mais le fait que / ne soit pas échappé.J'espère que cela évitera à quelqu'un d'autre le petit mal de tête que j'ai eu en comprenant ce que j'ai fait de mal.

supprimer les guillemets simples (astuce : eval==evil)

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

console.log(dataObj);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top