我已经生成了一些JSON,我试图把它拉到一个对象在JavaScript。我总是出错。以下是我所拥有的:

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

这给了我一个错误:

unterminated string literal

使用JSON.parse(data),我看到类似的错误消息:在Chrome中“意外的令牌()”,在Firefox和IE中“未终止的字符串文字”。

当我在sometext后面去掉\n时,两种情况下错误都消失了。我似乎不明白为什么\n使eval和JSON。解析失败。


当前回答

这是你想要的:

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

您需要转义字符串中的\(将其转换为双\),否则它将成为JSON源中的换行符,而不是JSON数据。

其他回答

例如,您可以在写入JSON字段值时在服务器上转义字符串,在客户机浏览器中检索值时取消转义。

所有主流浏览器的JavaScript实现都有unescape命令。

例子:

服务器端:

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

在浏览器中:

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

正如我理解你的问题,这不是关于解析JSON,因为你可以直接复制粘贴你的JSON到你的代码-所以如果是这种情况下,然后直接复制你的JSON到dataObj变量,而不包装它与单引号(提示:eval==evil)

var dataObj = {“count” : 1, “stack” : “sometext\n\n”}; console.log(dataObj);

好吧,当它可以简单地用1个CSS类完成时,真的没有必要为此创建一个函数。

只要把你的文本围绕这门课,就能看到神奇的地方:D

 <p style={{whiteSpace: 'pre-line'}}>my json text goes here \n\n</p>

注意:因为你总是在HTML的前面显示你的文本,你可以添加style={{whiteSpace: 'pre-line'}}到任何标签,而不仅仅是p标签。

你需要有一个函数来替换\n为\\n,以防数据不是字符串文字。

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

结果dataObj将为

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

我在PHP 4中创建一个类来模拟json_encode(在PHP 5中可用)时遇到了这个问题。下面是我想到的:

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

我遵循了这里提到的规则。我只使用了我需要的,但我认为您可以根据您所使用的语言对其进行调整以满足您的需要。在我的情况下,问题并不像我最初认为的那样是换行,而是关于/没有被转义。我希望这能防止别人像我一样头疼地发现我做错了什么。