首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将textarea值转换为有效的JSON字符串

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

Stack Overflow用户
提问于 2015-07-30 23:39:08
回答 3查看 11.5K关注 0票数 3

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

我所说的‘转换’是转义字符,如'\n‘和’.顺便说一句,我从HTML中获取用户输入。

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

如果用户输入

你好,新世界, 我的名字是“很棒”。

在HTML <textarea>中,

代码语言:javascript
复制
var content = $("textarea").val();

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

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

当服务器将客户端发布的数据以JSON格式发送回他们时,我的问题就发生了。

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

代码语言:javascript
复制
{ "code": 0, "id": 1, "content": "USER_POSTED_CONTENT" }

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

因此,我试图确保客户端提交有效的JSON字符串。

这是我做了一些研究后想出来的。

代码语言:javascript
复制
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字符串。

代码语言:javascript
复制
var content = txt.val().escapeForJson();
$.ajax(
   ...
   data:{ "content": content }
   ...
);

但后来..。str = JSON.stringify(str);似乎做了同样的工作!

然而,在阅读了JSON.stringify的真正用途之后,我感到很困惑。它说JSON.stringify是将JSON对象转换成字符串。

我并不是真正地将JSON对象转换为字符串。

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

更新:

JSON.stringify(内容)运行良好,但它在开头和结尾都增加了双引号。为了我的需要,我不得不手动移除它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-30 23:51:02

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

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

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

不添加json2.js,就不应该使用stringify,目标浏览器是IE7或更小。

票数 4
EN

Stack Overflow用户

发布于 2015-07-31 00:07:31

我不认为JSON.stringify能做你需要的事。在处理某些案件时,请检查一下这些行为:

代码语言:javascript
复制
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字符串和转义字符?如果前者:使用字符串,如果后者:使用字符串,然后在其之上使用您的函数。

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

票数 2
EN

Stack Overflow用户

发布于 2017-04-08 07:46:35

复杂。我不知道怎么说。

从函数列表中提取urlencode函数,然后稍微踢一下它。

代码语言:javascript
复制
<?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文本区域,这些文本区域可以使用HTML/CSS、DOS、Apple的组合,这取决于所剪切/粘贴的文本。

投票结果很搞笑,显示出明显缺乏知识。您只需要问问自己,如果这些数据是文件内容或其他行数组,您将如何在URL中传递这些数据?JSON.stringify是可以的,但是url编码在客户机/服务器ajax中工作得最好。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31735828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档