如何处理JSON中的换行符?

2020/10/04 19:21 · javascript ·  · 0评论

我生成了一些JSON,并尝试将其拉入JavaScript中的对象。我不断出错。这是我所拥有的:

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

这给我一个错误:

unterminated string literal

使用JSON.parse(data),我会看到类似的错误消息:Unexpected token ↵Chrome中的“ unterminated string literal,以及Firefox和IE中的”。

当我取出\nsometext,两种情况下错误都会消失。我似乎无法找出原因的\n品牌evalJSON.parse失败。

我想这就是你想要的:

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

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

你需要有它取代的功能\n\\n的情况下,data是不是一个字符串。

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"}

根据规范,http : //www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf

字符串是用引号(U+0022括起来的Unicode代码点的序列所有字符可放置在引号内除了必须转义字符:引号(U+0022),固相线反向(U+005C),并控制字符U+0000U+001F有些字符有两个字符的转义序列表示。

因此,您无法直接通过0x0A0x0C编码。这是被禁止的!该规范建议将转义序列用于一些明确定义的代码,从U+0000U+001F

  • \f代表换页字符(U+000C)。
  • \n代表换行符(U+000A)。

正如大多数编程语言\用于引用一样,您应转义转义语法(两次转义-一次用于语言/平台,一次用于JSON本身):

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

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

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

例:

在服务器上:

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

在浏览器中:

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

您可能需要研究以下C#函数来转义字符串:

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

我使用此函数来去除数据中的换行符或其他字符以解析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.stringify

JSON.stringify(`{ 
  a:"a"
}`)

将上面的字符串转换为

"{ \n      a:\"a\"\n    }"

如这里提到的

json串化

此函数在输入字符串的开头和结尾添加双引号,并转义特殊的JSON字符。特别是,用\ n字符替换换行符,用\ t字符替换制表符,用两个反斜杠\替换反斜杠,并在每个引号之前放置一个反斜杠。

好吧,当只需使用1个CSS类即可完成此功能时,实际上并没有必要为此创建函数。

只需将您的课文包装起来并看一下魔术:D

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

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

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

我遵循这里提到的规则我只使用了我需要的东西,但我认为您可以使用所使用的语言来使其适应您的需求。在我的情况下,问题不是我最初想到的换行符,而是/不被忽略。我希望这可以防止其他人因我弄清楚自己做错了什么而感到头疼。

据我了解你的问题,它不是关于解析JSON,因为您可以将您的JSON复制粘贴到你的代码中直接-所以,如果是这样的话那么就复制你的JSON直接到dataObj变量,而不单引号包裹它(提示:eval==evil

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

console.log(dataObj);
本文地址:http://javascript.askforanswer.com/ruhechulijsonzhongdehuanxingfu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!