Javascript 将textarea值转换为有效的JSON字符串

Javascript 将textarea值转换为有效的JSON字符串,javascript,json,string,Javascript,Json,String,我试图确保在提交到服务器之前,将来自用户的输入转换为有效的JSON字符串 我所说的“转换”是指转义字符,如“\n”和“”。 顺便说一句,我从HTMLtextarea获取用户输入 将用户输入转换为有效的JSON字符串对我来说非常重要,因为它将以JSON格式发布到服务器并发送回客户端。(无效的JSON字符串将使整个响应无效) 如果用户输入 你好,新世界, 我的名字叫“好极了” 在HTML中 内容将包含新行字符和双引号字符 服务器和数据库处理和存储数据不是问题 我的问题发生在服务器以JSON格式将客户

我试图确保在提交到服务器之前,将来自用户的输入转换为有效的JSON字符串

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

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

如果用户输入

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

在HTML

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

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

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

让我通过给出服务器响应的一些示例来进一步说明这一点。 这是一个JSON响应,如下所示

{ "code": 0, "id": 1, "content": "USER_POSTED_CONTENT" }
如果
USER\u POSTED\u CONTENT
包含新行字符“\n”、双引号或任何必须转义但未转义的字符,则它不再是有效的JSON字符串,客户端的JavaScript引擎无法解析数据

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

var content = txt.val().escapeForJson();
$.ajax(
   ...
   data:{ "content": content }
   ...
);
这是我做了一些研究后得出的结论

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字符串对象完全可以吗

更新:

stringify(内容)工作得很好,但它在开始和结束时都添加了双引号。我不得不根据需要手动删除它。

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

编辑: 您可能希望使用对象而不是简单的字符串,因为您希望发送一些其他信息

例如,您可能希望发送其他输入的内容,这些内容将在以后开发


如果目标浏览器是IE7或更低版本,而没有添加json2.js,则不应使用stringify。

我认为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,然后在其上使用函数


高度相关:

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

从函数列表中获取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包装的函数,它将在运行一段解释代码后对字符数组进行一次迭代

返回的文本区域将与输入的文本区域完全相同,不会打乱wyswyg编辑器或基本HTML5文本区域,根据剪切/粘贴的文本,这些文本区域可以使用HTML/CSS、DOS、Apple和Unix的组合


反对票很搞笑,而且明显缺乏知识。你只需要问问自己,如果这些数据是文件内容或其他行数组,你会如何在URL中传递这些数据?JSON.stringify可以,但URL编码在客户端/服务器ajax中效果最好。

谢谢你的回答!我的问题可能有点太多了nclear。我想要的是前者。谢谢!!哇,我只是在看我的代码,在这里我用了这个问题。我终于成为了那些发错帖子的人之一。我使用url编码区块链内容以便于阅读~在这些例子中,内容输出不等于内容输出+进入所有空间。在我的情况下,我需要将数据以字符串形式存储在Solr中,\n\r会破坏服务器端存储的完整性。我会在一天结束时更正此动物帖子。