Javascript 如何处理JSON中的换行符?

Javascript 如何处理JSON中的换行符?,javascript,json,newline,Javascript,Json,Newline,我已经生成了一些JSON,并试图将其拉入JavaScript中的对象。我总是出错。以下是我所拥有的: var data = '{"count" : 1, "stack" : "sometext\n\n"}'; var dataObj = eval('('+data+')'); 这给了我一个错误: unterminated string literal 在JSON.parse(data)中,我看到了类似的错误消息:“意外令牌”↵,以及Firefox和IE中的“未终止字符串文字” 当我在some

我已经生成了一些JSON,并试图将其拉入JavaScript中的对象。我总是出错。以下是我所拥有的:

var data = '{"count" : 1, "stack" : "sometext\n\n"}';
var dataObj = eval('('+data+')');
这给了我一个错误:

unterminated string literal
JSON.parse(data)
中,我看到了类似的错误消息:“
意外令牌”↵,以及Firefox和IE中的“
未终止字符串文字”

当我在
sometext
之后取出
\n
时,这两种情况下的错误都会消失。我似乎不明白为什么
\n
使
eval
JSON.parse
失败

这就是你想要的:

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

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

您可能需要查看此C函数来转义字符串:

publicstaticstringenquote(字符串s)
{ 
如果(s==null | | s.长度==0)
{ 
返回“\”\”;
} 
字符c;
int i;
int len=s.长度;
StringBuilder sb=新StringBuilder(len+4);
字符串t;
某人附加(“”);
对于(i=0;i'))
{ 
某人附加(“\\”);
sb.附加(c);
} 
else如果(c=='\b')
sb.附加(\\b”);
else如果(c=='\t')
某人附加(\\t);
else如果(c=='\n')
某人附加(\\n);
else如果(c=='\f')
某人附加(\\f);
else如果(c=='\r')
某人附加(\\r);
其他的
{ 
如果(c<'')
{ 
//t=“000”+整数.tohextstring(c);
字符串t=新字符串(c,1);
t=“000”+int.Parse(tmp,System.Globalization.NumberStyles.HexNumber);
sb.追加(“\\u”+t.子字符串(t.长度-4));
}  
其他的
{ 
sb.附加(c);
} 
} 
} 
某人附加(“”);
使某人返回字符串();
} 

如果
数据
不是字符串文字,则需要有一个函数将
\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"}

我在PHP4中创建一个类来模拟json_encode(在PHP5中提供)时遇到了这个问题

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

我遵守了上面提到的规则。我只使用了我需要的东西,但我想你可以用你正在使用的语言来适应你的需要。我的问题不是我最初认为的换行,而是关于/没有被逃脱。我希望这能防止其他人因为我发现我做错了什么而头疼。

我使用此函数剥离数据中的换行符或其他字符以解析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']);

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

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

例如:

在服务器上:

response.write "{""field1"":""" & escape(RS_Temp("textField")) & """}"
在浏览器中:

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

根据规范:

字符串是用引号括起来的Unicode代码点序列 (
U+0022
)。除 必须转义的字符:引号(
U+0022
),反索利多卡因 (
U+005C
),以及控制字符
U+0000
U+001F
。有两个字符 某些字符的转义序列表示

因此,您不能直接传递
0x0A
0x0C
代码。这是禁止的!规范建议对一些定义良好的代码使用转义序列,从
U+0000
U+001F

  • \f
    表示表单馈送字符(
    U+000C
  • \n
    表示换行符(
    U+000A
由于大多数编程语言都使用
\
进行引用,因此应该转义转义语法(双转义-一次用于语言/平台,一次用于JSON本身):


据我所知,这不是关于解析JSON的问题,因为您可以直接将JSON复制粘贴到代码中——因此,如果是这种情况,只需将JSON直接复制到
dataObj
变量,而不必使用单引号将其括起来(提示:
eval==evil

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

console.log(dataObj);
好吧,如果只需要一个CSS类就可以完成,那么实际上不需要为此创建函数

只要把你的课文绕在这节课上,看看神奇的:D

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

我的json文本在这里\n\n


注意:因为您将始终使用HTML在前端显示文本,所以您可以将样式={{whiteSpace:'pre line'}}添加到任何标记,而不仅仅是p标记。

TLDR:解决作者问题的方法。

使用
String.raw
literal:

SyntaxError: Unexpected token
my multiline
value
my multiline\nvalue
var data=String.raw`{“count”:1,“stack”:“sometext\n\n”}`;

出于某种原因,这里的所有答案都集中在如何解析JavaScript中的JSON字符串表示,这可能会导致关于如何在实际JSON上表示换行符的混淆。后者不依赖于语言

严格按照问题标题:

SyntaxError: Unexpected token
my multiline
value
my multiline\nvalue
如何处理JSON中的换行符? 假设您在
节点中使用以下代码解析JSON文件(可以是任何语言):


让obj=JSON.parse(fs.readFileSync('file.JSON');
console.log(obj.mykey)
下面是
file.json的每个可能内容的输出:

输入1:

SyntaxError: Unexpected token
my multiline
value
my multiline\nvalue