【问题标题】:Converting textarea value into a valid JSON string将 textarea 值转换为有效的 JSON 字符串
【发布时间】:2015-10-22 12:32:11
【问题描述】:

我正在尝试确保用户的输入在提交到服务器之前转换为有效的 JSON 字符串。

我所说的“转换”是转义字符,例如“\n”和“””。 顺便说一句,我正在从 HTML textarea 获取用户输入。

将用户输入转换为有效的 JSON 字符串对我来说非常重要,因为它将被发布到服务器并以 JSON 格式发送回客户端。 (无效的 JSON 字符串会使整个响应无效)

如果用户输入了

你好新世界,
我的名字叫“好极了”。

在 HTML <textarea>,

var content = $("textarea").val();

内容将包含换行符和双引号字符。

服务器和数据库处理和存储数据不是问题。

我的问题发生在服务器将客户端发布的数据以 JSON 格式发回给他们时。

让我通过一些我的服务器响应的例子来进一步澄清它。 这是一个 JSON 响应,看起来像这样

{ "code": 0, "id": 1, "content": "USER_POSTED_CONTENT" }

如果USER_POSTED_CONTENT 包含换行符“\n”、双引号或任何必须转义但未转义的字符,则它不再是有效的 JSON 字符串,客户端的 JavaScript 引擎无法解析数据。

所以我试图确保客户端提交的是有效的 JSON 字符串。

这是我做了一些研究后得出的结论。

String.prototype.escapeForJson = function() {
  return this
    .replace(/\b/g, "")
    .replace(/\f/g, "")
    .replace(/\\/g, "\\")
    .replace(/\"/g, "\\\"")
    .replace(/\t/g, "\\t")
    .replace(/\r/g, "\\r")
    .replace(/\n/g, "\\n")
    .replace(/\u2028/g, "\\u2028")
    .replace(/\u2029/g, "\\u2029");
};

我使用这个函数来转义所有需要转义的字符,以便创建有效的 JSON 字符串。

var content = txt.val().escapeForJson();
$.ajax(
   ...
   data:{ "content": content }
   ...
);

但是...看来str = JSON.stringify(str); 做了同样的工作!

但是,在阅读了 JSON.stringify 的真正用途后,我感到很困惑。上面写着JSON.stringify是把JSON对象转成字符串。

我并没有真正将 JSON 对象转换为字符串。

所以我的问题是... 使用JSON.stringify 将用户输入转换为有效的 JSON 字符串对象完全可以吗??

更新:

JSON.stringify(content) 效果很好,但它在开头和结尾添加了双引号。我不得不手动删除它以满足我的需要。

【问题讨论】:

    标签: javascript json string


    【解决方案1】:

    复杂性。我不知道说什么。

    从你的函数列表中取出 urlencode 函数,然后稍微调整一下。

    <?php
    
    $textdata = $_POST['textdata'];
    
    ///// Try without this one line and json encoding tanks
    $textdata = urlencode($textdata);
    
    
    /******* textarea data slides into JSON string because JSON is designed to hold urlencoded strings ******/ 
    
    $json_string = json_encode($textdata); 
    
    
    //////////// decode just for kicks and used decoded for the form
    
    $mydata = json_decode($json_string, "true");
    
    /// url decode
    $mydata = urldecode($mydata['textdata']);
    
    ?>
    
    
    <html>
    <form action="" method="post">
    <textarea name="textdata"><?php echo $mydata; ?></textarea>
    <input type="submit">
    </html>
    

    同样的事情可以用 Javascript 来将 textarea 数据存储在本地存储中。除非处理了所有的 unix 格式,否则 textarea 将再次失败。答案是使用 urldecode/urlencode 并踢它。

    我相信服务器端的 urlencode 将是一个 C 包装函数,它在运行解释代码的 sn-p 时迭代 char 数组。

    返回的文本区域将与输入的内容完全相同,零概率破坏所见即所得的编辑器或基本的 HTML5 文本区域,可以使用 HTML/CSS、DOS、Apple 和 Unix 的组合,具体取决于剪切/粘贴的文本。

    否决票很搞笑,表明明显缺乏知识。您只需要问自己,如果这些数据是文件内容或其他一些行数组,您将如何在 URL 中传递这些数据? JSON.stringify 没问题,但 url 编码在客户端/服务器 ajax 中效果最好。

    【讨论】:

    • 哇,我只是在查看我在解决这个问题的地方的代码。我终于成为那些发错帖子的人之一。为了便于阅读,我使用 url 编码区块链内容〜在这些示例中,内容输出不等于内容输出 + 进入所有空间。在我的情况下,我需要将数据存储在 Solr 中的字符串中,并且 \n \r 破坏了服务器端存储的完整性。我会在一天结束时更正这个动物帖子。
    【解决方案2】:

    我认为 JSON.stringify 不能满足您的需求。在处理一些案例时检查一下行为:

    JSON.stringify('\n\rhello\n')
    *desired : "\\n\\rhello\\n"
    *actual  : "\n\rhello\n"
    
    JSON.stringify('\b\rhello\n')
    *desired : "\\rhello\\n"
    *actual  : "\b\rhello\n"
    
    JSON.stringify('\b\f\b\f\b\f')
    *desired : ""
    *actual  : ""\b\f\b\f\b\f""
    

    stringify 函数返回一个有效的 JSON 字符串。有效的 JSON 字符串不需要对这些字符进行转义。

    问题是...您只需要有效的 JSON 字符串吗?或者您是否需要有效的 JSON 字符串和转义字符?如果是前者:使用stringify,如果是后者:使用stringify,然后在它上面使用你的函数。

    高度相关:How to escape a JSON string containing newline characters using javascript?

    【讨论】:

    • 感谢您的回答!我的问题可能不太清楚。我想要的是前者。谢谢!!
    【解决方案3】:

    是的,完全没问题。 您不需要重新发明已经存在的东西,您的代码将对其他开发人员更有用。

    编辑: 您可能想使用 object 而不是一个简单的字符串,因为您想发送一些其他信息。

    例如,您可能希望发送稍后将开发的另一个输入的内容。

    你不应该使用stringify是目标浏览器是IE7或更低而不添加json2.js。

    【讨论】:

      猜你喜欢
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多