我的设置:
我正在做的是从MySQL(40,000多行)中拉出一个非常大的表
SpoolInfo.request.query("SELECT SpoolNumber AS a, DrawingNumber AS b, LineSize AS c, PipeSpec AS d, CU AS e, SheetNumber AS f, FluidCode AS g FROM Job" + JobNumber + ".SpoolInfo ORDER BY SpoolNumber ASC");
对它进行简单的操作,以便将我必须发送给它的应用程序的格式化为:
if(SpoolInfo.response.data){
SpoolInfoRowsObj = {"Cache":[]};
SpoolInfo.response.data.forEach(function(d,di){
SpoolInfoRowsObj.Cache.push(_.values(SpoolInfo.response.data[di]));
});
然后将其存储回Cache表中以便更快地访问:
(这是必需的,因为我无法找到一种方法使.forEach循环运行得更快,目前需要20秒。)
UpdateCacheTable1.request = new AP.MySQL.Request();
UpdateCacheTable1.request.execute("UPDATE `Job" + JobNumber + "`.`CacheTable_SpoolInfo` SET `SpoolInfoObj` = '" + JSON.stringify(SpoolInfoRowsObj.Cache) + "' WHERE ID = 1");
问题:
当我稍后检索该数据时:
CacheSpoolInfo.request.query("SELECT SpoolInfoObj FROM Job" + GetJobNumber.response.data[0].JobNumber + ".CacheTable_SpoolInfo ");
CommRef_.SpoolInfo = CacheSpoolInfo.response.data
尝试使用是这样的:
....
}else if (t == "SpoolInfo"){
rowsObj = {"Rows":[]};
rowsObj = {"Rows":JSON.parse(CommRef_.SpoolInfo[0].SpoolInfoObj)};
}else{
....
它有一堆额外的" \"其中包含所有特殊字符的内容:
"Rows": [
[
"[[\" 1-AII22-84042S01 \",\"1040\r\"],[\"0-A102-27564S01 \",\"110\r\"],.....
]
]
当然,输出与我保存的JSON结构格式不同。
我有点想过使用JSON.stringify()和JSON.parse(),就像我做的那样。
我的问题:
我如何处理这个问题,以便我回收的数据可以像我发送到数据库之前那样处理? AKA摆脱了所有的小斜线,所以JSON可以再次解析它。
答案 0 :(得分:0)
问题是当你将字符串保存回来时,MySQL正在添加转义,因为MySQL不知道JSON是什么,并将其存储为VARCHAR
。解决这个问题的一种简单方法是在将字符串存储到数据库之前自行转义。
例如,如果您有一个PHP后端,那么存储就可以
$escapedString = mysqli_escape_string($myJSONString);
// Store $escapedString in db
对于,检索,你会做
$escapedString = // query code
$myJSONString = stripslashes($escapedString);
如何处理转义将根据您的后端架构而有所不同。您还可以考虑使用对JSON具有本机支持的数据库。
另一个选择是编写一个JavaScript函数来为你进行剥离(没有这样做的本机函数)。一些正则表达式应该是可行的。要了解如何解决此问题,请参阅此existing SO question related to stripping slashes。请注意,您需要稍微更改一下,因为您只想删除转义斜杠,而在该帖子中OP想要删除所有斜杠(这对JSON来说是错误的,因为您的数据实际上可能包含斜杠)。