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

时间:2015-07-30 23:39:08

标签: javascript json string

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

我的意思是'转换'正在逃避诸如' \ n'等人物。和'''。 顺便说一句,我正在从HTML textarea获取用户输入。

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

如果用户输入

  

Hello New World,你好   我的名字是"精彩"。

HTML中的

<textarea>

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

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

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

当服务器将 JSON格式的客户端发布的数据发回给时,我的问题就出现了。

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

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

如果USER_POSTED_CONTENT包含换行字符&#39; \ n&#39;,双引号或任何必须转义但未转义的字符,则它不再是有效的JSON字符串和客户端&# 39; s 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(内容)运行良好,但它在开头和结尾添加了双引号。我不得不根据自己的需要手动删除它。

3 个答案:

答案 0 :(得分:3)

是的,这完全没问题。 您不需要重新发明已存在的内容,并且您的代码对于其他开发人员更有用。

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

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

你不应该使用stringify,如果没有添加json2.js,目标浏览器是IE7或更小。

答案 1 :(得分:1)

我认为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?

答案 2 :(得分:-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包装函数,一旦运行一段解释代码就会迭代char数组。

返回的文本区域将完全是输入wyswyg编辑器或基本HTML5 textarea的可能性,它可以使用HTML / CSS,DOS,Apple和Unix的组合,具体取决于剪切/粘贴的文本。< / p>

下来的选票非常热闹,显示出明显缺乏知识。您只需要问自己,如果这些数据是文件内容或其他一些行,您将如何在URL中传递此数据? JSON.stringify没问题但是url编码在客户端/服务器ajax中效果最好。