Frage

Ich habe JSON generiert und versuche, es in ein Objekt in JavaScript zu ziehen.Ich bekomme ständig Fehler.Hier ist, was ich habe

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

Das gibt mir einen Fehler

unterminated string literal

Mit JSON.parse(data), ich sehe ähnliche Fehlermeldungen:"Unexpected token ↵„in Chrome und“unterminated string literal" in Firefox und IE.

Wenn ich das herausnehme \n nach sometext Der Fehler verschwindet in beiden Fällen.Ich kann anscheinend nicht herausfinden, warum das so ist \n macht eval Und JSON.parse scheitern.

War es hilfreich?

Lösung

Ich denke, das ist es, was Sie wollen:

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

(Sie müssen das „\“ in Ihrer Zeichenfolge maskieren (in ein doppeltes „\“ umwandeln), sonst wird es zu einer neuen Zeile in der JSON-Quelle und nicht in den JSON-Daten.)

Andere Tipps

Sie benötigen eine Funktion, die ersetzt \n Zu \\n falls data ist kein 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));

Resultierend dataObj wird sein

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

Laut Spezifikation: 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.

Du kannst also nicht passieren 0x0A oder 0x0C Codes direkt.Es ist verboten!Spec schlägt vor, Escape-Sequenzen für einige gut definierte Codes zu verwenden U+0000 Zu U+001F:

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

Wie die meisten Programmiersprachen verwenden \ Zum Zitieren sollten Sie die Escape-Syntax mit Escapezeichen versehen (doppeltes Escapezeichen – einmal für Sprache/Plattform, einmal für Json selbst):

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

Sie könnten Ihre Zeichenfolge beispielsweise einfach auf dem Server maskieren, wenn Sie den Wert des JSON-Felds schreiben, und die Escape-Funktion aufheben, wenn Sie den Wert beispielsweise im Client-Browser abrufen.

Die Javascript-Implementierung aller gängigen Browser verfügt über den Befehl unescape.

Beispiel:auf dem Server:

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

im Browser:

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

Vielleicht möchten Sie sich diese C#-Funktion ansehen, um die Zeichenfolge zu maskieren:

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

Hallo, ich habe diese Funktion verwendet, um Zeilenumbrüche oder andere Zeichen in Daten zu entfernen, um JSON-Daten zu analysieren:

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

Ich bin auf dieses Problem gestoßen, als ich in PHP4 eine Klasse erstellt habe, um json_encode (verfügbar in PHP5) zu emulieren.Folgendes habe ich mir ausgedacht:

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

Ich habe mich an die genannten Regeln gehalten Hier.Ich habe nur das verwendet, was ich brauchte, aber ich denke, dass Sie es in der Sprache, die Sie verwenden, an Ihre Bedürfnisse anpassen können.Das Problem in meinem Fall bestand nicht in den Zeilenumbrüchen, wie ich ursprünglich gedacht hatte, sondern darin, dass / nicht maskiert wurde.Ich hoffe, dass dies jemand anderem die kleinen Kopfschmerzen erspart, die ich hatte, als ich herausfand, was ich falsch gemacht habe.

Entfernen Sie einfache Anführungszeichen (Tipp: eval==evil)

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

console.log(dataObj);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top