Когда эта структура 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' })