Javascript 如何处理JSON中的换行符?
我已经生成了一些JSON,并试图将其拉入JavaScript中的对象。我总是出错。以下是我所拥有的: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
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',
"`" => "'", "´" => "'", '"' => ',', '`' => "'",
'´' => "'", '"' => '\"', '"' => "\"", '´' => "'",
"’" => "'",
"{" => "",
"~" => "", "–" => "-", "'" => "'", " " => " ");
$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