问题描述
我试图确保用户的输入在提交给服务器之前转换为有效的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.stringify
是将JSON Object转换为字符串。
我不是真的将JSON对象转换为字符串。
所以我的问题是......使用JSON.stringify
将用户输入转换为有效的JSON字符串对象是否完全可以?
更新:
JSON.stringify(内容)运行良好,但它在开头和结尾添加了双引号。 我不得不手动删除它以满足我的需求。
1楼
Didier Aupest
3
已采纳
2015-07-30 23:51:02
是的,完全没问题。 您不需要重新发明已存在的内容,并且您的代码对于其他开发人员更有用。
编辑:您可能希望使用对象而不是简单的字符串,因为您想发送一些其他信息。
例如,您可能希望发送稍后将开发的另一个输入的内容。
你不应该使用stringify是目标浏览器是IE7或更小而不添加json2.js。
2楼
Toby Liu
1
2015-07-31 00:07:31
我不认为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,然后在它上面使用你的函数。
高度相关:
3楼
Greg Weldon
-1
2017-04-08 07:46:35
复杂。 我不知道说什么。
从你的函数列表中取出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包装函数,一旦运行一段解释代码就会迭代char数组。
返回的文本区域将完全是输入wiswyg编辑器或基本HTML5 textarea的可能性,它可以使用HTML / CSS,DOS,Apple和Unix的组合,具体取决于剪切/粘贴的文本。
低票是热闹的,显示出明显缺乏知识。 您只需要问自己,如果这些数据是文件内容或其他一些行,您将如何在URL中传递此数据? JSON.stringify没问题但是url编码在客户端/服务器ajax中效果最好。