Когда эта структура JSON преобразуется во все строки?
Я отправляю структуру JSON на свой node/express сервер и сохраняя объект в базе данных. Проблема в том, что я отправляю JSON с целыми числами и булерами, но все сохраняется в виде строк.
Вот мой код node/express:
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'});
})
});
Вот как я отправляю POST с помощью 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}, но сторона node сообщила, что она получила { "siteid": "123" }.
Где целое число преобразуется в строку?
Ответы
Ответ 1
Ваши данные преобразуются в строку как продукт отправки от клиента к серверу. Помните, что клиент и сервер фактически не взаимодействуют в JSON, они обмениваются текстовыми или двоичными данными. Сервер (Express?) Неявно интерпретирует данные, отправленные в виде строки, которая преобразуется в JSON, если вы включаете заголовок запроса content-type: application/json
. Вам нужно явно указать тип проверки и конвертировать на сервере, если вы хотите, чтобы данные сохранялись в определенном формате.
TL;DR (комментарии); не полагайтесь на клиента для отправки достоверных данных. Очистите его, прежде чем сохранять его в базе данных.
Ответ 2
У меня возникла такая же проблема. jQuery $.post и $.ajax преобразуют целые числа в строки при подстановке JSON. Вы можете проверить это, посмотрев данные на стороне сервера. Сервер получает что-то вроде { "age": "3" }, в то время как вы действительно хотите { "age": 3}.
Решение, которое работает, заключается в том, чтобы избежать предоставления чистых объектов jQuery, но вместо этого дать ему строку:
$.ajax({
type:'POST',
url: '/api/...',
data: JSON.stringify(data),
contentType: 'application/json'
})