410 Stimmen

Wie behandle ich Zeilenumbrüche in JSON?

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

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

Dies führt zu einer Fehlermeldung:

unterminated string literal

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

Wenn ich die Karte herausnehme \n nach sometext der Fehler verschwindet in beiden Fällen. Ich kann nicht herausfinden, warum die \n macht eval y JSON.parse scheitern.

3voto

Sie könnten Ihre Zeichenkette auf dem Server beim Schreiben des Wertes des JSON-Feldes einfach entschlüsseln und sie beim Abrufen des Wertes im Client-Browser wieder entschlüsseln, zum Beispiel.

Die JavaScript-Implementierung aller wichtigen 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)

2voto

Ron Punkte 1809

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

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

0voto

ShivarajRH Punkte 854

Ich habe diese Funktion verwendet, um Zeilenumbrüche oder andere Zeichen in Daten zu entfernen, um JSON-Daten zu parsen:

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

-1voto

GabrielP Punkte 37

Ich stieß auf dieses Problem bei der Erstellung einer Klasse in PHP 4, um json_encode (verfügbar in PHP 5) zu emulieren. Hier ist, was ich kam mit:

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 die genannten Regeln befolgt aquí . Ich habe nur das verwendet, was ich brauchte, aber ich denke, Sie können es an Ihre Bedürfnisse in der Sprache, die Sie verwenden, anpassen. In meinem Fall lag das Problem nicht an den Zeilenumbrüchen, wie ich ursprünglich dachte, sondern daran, dass das / nicht escaped wurde. Ich hoffe, dass dies jemandem die Kopfschmerzen erspart, die ich hatte, als ich herausfand, was ich falsch gemacht hatte.

-5voto

Kamil Kiełczewski Punkte 69048

So wie ich Ihre Frage verstehe, geht es nicht um das Parsen von JSON, weil Sie Ihr JSON direkt in Ihren Code einfügen können - wenn dies der Fall ist, dann kopieren Sie Ihr JSON einfach direkt nach dataObj Variable, ohne sie mit einfachen Anführungszeichen zu umschließen (Tipp: eval==evil )

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

console.log(dataObj);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X