即使添加了另一个反斜杠,JSON 解析器仍然在换行符上失败

Posted

技术标签:

【中文标题】即使添加了另一个反斜杠,JSON 解析器仍然在换行符上失败【英文标题】:JSON parser keeps failing on newline even after adding another backslash 【发布时间】:2020-12-13 17:03:01 【问题描述】:

所以我正在为一个学校项目制作一个消息传递平台,我试图保护我的数据库,保护 XSS 攻击,并允许每个字符,包括换行符。

到目前为止,我已经涵盖了所有内容,除了换行符。 JSON 解析器无法解析一个简单的换行符。

我尝试在换行符前加上另一个反斜杠 (\\n),但还是不行!

我该怎么办?!

编辑 1:添加了生成 JSON 数据的代码

string message = "[";
string uid;
for (int i = 0; i < data.Rows.Count; i++) 
    if (StringCipher.ConvertToUnixTimestamp(DateTime.Now.AddMinutes(-5)) > int.Parse(data.Rows[i][5].ToString())) 
        queryDelete = "DELETE * FROM Bubbleland WHERE MessageID = " + data.Rows[i][0] + ";";
        commandDelete = new OleDbCommand(queryDelete, connection);
        commandDelete.ExecuteNonQuery();
     else 
        message += "\"mid\":" + data.Rows[i][0];
        if (data.Rows[i][1].ToString() == "")
            uid = "user";
        else
            uid = data.Rows[i][1].ToString();
        message += ", \"uid\":\"" + uid;
        message += "\", \"name\": \"" + data.Rows[i][2];
        message += "\", \"color\": \"" + data.Rows[i][3];
        message += "\", \"content\": \"" + data.Rows[i][4];
        message += "\"";
        if (i + 1 < data.Rows.Count) 
            message += ",";
        
    


message += "]";

编辑2:添加JS处理代码

async function fetchMessages() 
$.ajax(
    type: "POST",
    url: "../ASPX/bubblelandFetch.aspx",
    success: function (data) 
        console.log(data);
        data = JSON.parse(data);
        var container = document.getElementById("messages-container");
        var uid;
        container.innerhtml = "";

        console.log(data);

        for (var i in data) 
            var message = '<div id="' + data[i]["mid"];
            message += '" class="message ' + data[i]["color"] + '">';
            message += '<div class="profile-container">';

            if (data[i]["uid"] == "user")
                uid = "/Media/user"
            else
                uid = "/Media/Profile/" + data[i]["uid"];

            message += '<img src="' + uid + '.png"/>';
            message += '<span>' + data[i]["name"] + '</span></div>';
            message += '<div class="content">' + data[i]["content"] + '</div>';

            container.innerHTML += message;
        
    ,

    complete: function () 
        setTimeout(fetchMessages, intevral);
    
);

【问题讨论】:

这个 JSON 来自哪里?创建有效的、可解析的 JSON 的最佳方法是从另一个数据结构自动创建它 直接从我的数据库中,预处理并打包成一个整洁的Response.Write 就像我说的,永远不要滚动你自己的 JSON。服务器端代码是什么语言/框架?当然有一个本地数据结构到 JSON 转换器可用 这是带有 .NET 框架的 ASPX/C#。我相信即使有一种将其转换为 JSON 的本机方式,也没有关系,因为我需要以自定义方式从数据库中转换它。 .NET Framework 4.7.2 【参考方案1】:

在解析了您提供给我的字符串后,我偶然发现了一个修复程序,并进行了进一步的研究以了解为什么会发生这种情况。

简单来说:‘单引号‘转义’单引号”“双引号‘转义’双引号”

这些引号的意思是,当使用单引号创建字符串文字时,您必须使用反斜杠 \ 转义任何单引号,以使字符串文字有效。使用双引号创建字符串文字时也是如此,但使用反斜杠转义双引号。

一开始我并没有意识到这个问题,尽管我一开始就知道这个问题并且我一直一直这样做

我遇到了这个Medium article 有助于把东西放在一起,我建议你阅读它以更新使用单引号/双引号和字符串文字。

【讨论】:

【参考方案2】:

事实证明,一个未转义的 \r 正在搞乱 JSON 解析器。

每当您Shift + Enter 时,它都会放置\r\n 而不是简单的\n。我不知道它会这样做。所以在我的 ASPX 后端代码中,我将 \r\n 替换为 &lt;br&gt;

【讨论】:

以上是关于即使添加了另一个反斜杠,JSON 解析器仍然在换行符上失败的主要内容,如果未能解决你的问题,请参考以下文章

Json.NET在返回json序列化字符串时添加反斜杠

JSON解析 之 带有反斜杠 "" 的JSON格式请求参数的解析

斜杠反斜杠以及换行符

php 数组中有反斜杠,解析为json格式就变成\/这样怎么解决啊

为啥 json_encode 添加反斜杠?

json_encode 添加反斜杠