这个 JSON 结构何时转换为所有字符串?
Posted
技术标签:
【中文标题】这个 JSON 结构何时转换为所有字符串?【英文标题】:When is this JSON structure getting converted to all strings? 【发布时间】:2013-03-06 07:21:12 【问题描述】:我正在向我的节点/快递服务器发送 JSON 结构并将对象保存到数据库中。问题是我发送带有整数和布尔值的 JSON,但所有内容都保存为字符串。
这是我的节点/快递代码:
var express = require('express');
var app = express();
app.enable("jsonp callback");
app.use(express.bodyParser());
// allow cross origin scripting to get data from devices directly
app.all('*', function(req, res, next)
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
);
app.post('/departures', function(req, res)
/* I started using this to convert back to integers - but need to solve the problem
for (var i in req.body.data)
req.body.data[i].siteid = parseInt(req.body.data[i].siteid);
*/
console.log('saving data '+JSON.stringify(req.body.data));
positionProvider.save(req.body.data, function()
res.json(status:'success');
)
);
这是我使用 jquery 发布的方式:
var data = ["siteid":123];
$.ajax(
type: 'POST',
url: serverUrl + '/departures',
data:
data: data
,
success: function(resp)
alert('saved departure data '+JSON.stringify(data))
,
error: function(err)
console.log('error posting to server...');
console.log(err);
);
jquery 端报告它发送了 "siteid":123 但节点端报告它收到了 "siteid":"123"。
整数在哪里转换成字符串?
【问题讨论】:
您使用的是什么数据库?你的模型对象是什么样的? 我正在使用 mongodb,所以它很乐意存储我手上的任何东西。 这也是我正常使用的。你使用猫鼬模型来设置数据结构吗? 我是 mongo 的新手——还没有数据模型。这听起来像是一个解决方案,但我希望有人能回答为什么我的类型在 POST 期间被转换。 您的数据在 Mongo 中是什么样的?是 Mongo 内部的字符串吗? 【参考方案1】:您的数据被转换为字符串,作为从客户端发送到服务器的产物。请记住,客户端和服务器实际上并不是以 JSON 进行通信,而是以文本或二进制数据进行通信。服务器(Express?)隐式解释作为字符串发送的数据,如果您包含 content-type: application/json
请求标头,则将其转换为 JSON。如果您希望数据以特定格式保留,则需要在服务器上明确键入检查和转换。
TLDR (cmets);不要依赖客户端发送有效数据。在将其保存到数据库之前对其进行清理。
【讨论】:
这是有道理的。我目前正在通过在客户端进行字符串化并在服务器上进行解析来解决这个问题。整数和布尔值仍然存在。 实际上,我怀疑 express.bodyParser() 正在丢失类型。 jquery 不只是 stringify() 数据并将其发送到正文中吗?当我手动执行此操作并在服务器上 parse() 时,我的整数和布尔值等保持它们的类型。 没关系,请注意,如果在从持久状态恢复数据后对数据执行逻辑操作,您将遇到挑战和难以发现的错误! 我不知道jQuery是否只是调用JSON.stringify()
。无论如何,我强烈建议您在持久化数据之前进行类型检查或强制转换,以防止数据格式的不一致破坏您的一天。您已经看到 jQuery 和您自己的工作之间的混合结果。
同意 - 我应该使用数据模型(Mongoose?)请注意,混合结果都使用 jquery - 区别在于我是向 bodyParser 发送一个对象还是向它发送一个字符串并自己解析。跨度>
【参考方案2】:
我遇到了同样的问题。 jQuery $.post 和 $.ajax 在对 JSON 进行字符串化时将整数转换为字符串。您可以通过查看服务器端的数据来验证它。服务器收到类似 "age": "3" 的内容,而您确实想要 "age": 3 。
可行的解决方案是避免给 jQuery 纯对象,而是给它一个字符串:
$.ajax(
type:'POST',
url: '/api/...',
data: JSON.stringify(data),
contentType: 'application/json'
)
【讨论】:
将以上内容添加到标题中对我有用。然后服务器端(Express)我只是bodyParser.json()
作为中间件来解析JSON然后req.body.propName
并且能够得到格式正确的JSON。
app.use(bodyParser.json())
以上是关于这个 JSON 结构何时转换为所有字符串?的主要内容,如果未能解决你的问题,请参考以下文章