Ответ с помощью объекта JSON в Node.js (преобразование объекта / массива в строку JSON)

99

Я новичок в серверном коде и пытаюсь создать функцию, которая будет отвечать мне строкой JSON. У меня сейчас это из примера

function random(response) {
  console.log("Request handler 'random was called.");
  response.writeHead(200, {"Content-Type": "text/html"});

  response.write("random numbers that should come in the form of json");
  response.end();
}

По сути, это просто выводит строку «случайные числа, которые должны быть в форме JSON». Я хочу, чтобы это ответило строкой JSON с любыми числами. Мне нужно поставить другой тип контента? должна ли эта функция передать это значение другому, скажем, на стороне клиента?

Спасибо за вашу помощь!

альпинистский
источник
res.json ({"Ключ": "Значение"});
Amol M Kulkarni

Ответы:

163

Использование res.json с Express:

function random(response) {
  console.log("response.json sets the appropriate header and performs JSON.stringify");
  response.json({ 
    anObject: { item1: "item1val", item2: "item2val" }, 
    anArray: ["item1", "item2"], 
    another: "item"
  });
}

Альтернативно:

function random(response) {
  console.log("Request handler random was called.");
  response.writeHead(200, {"Content-Type": "application/json"});
  var otherArray = ["item1", "item2"];
  var otherObject = { item1: "item1val", item2: "item2val" };
  var json = JSON.stringify({ 
    anObject: otherObject, 
    anArray: otherArray, 
    another: "item"
  });
  response.end(json);
}
Кевин Рейли
источник
77
var objToJson = { };
objToJson.response = response;
response.write(JSON.stringify(objToJson));

Если вы alert(JSON.stringify(objToJson))получите{"response":"value"}

Druveen
источник
Помните, что res.write (JSON.stringify ()) все еще ждет, пока вы «закончите» ответ. (Отправить()) ; express .json () к этому для вас
131
23

Вы должны использовать JSON.stringify()функцию, включенную в двигатель V8, который использует узел.

var objToJson = { ... };
response.write(JSON.stringify(objToJson));

Изменить: насколько мне известно, IANA официально зарегистрировала тип MIME для JSON, как application/jsonв RFC4627 . Он также занесен в Internet Media Type список здесь .

Tyronegcarter
источник
Должен ли заголовок типа содержимого также быть установлен как application / json или что-то в этом роде? Что для этого лучше всего?
амперсанд
1
Да, чтобы сделать его правильным ответом, клиент поймет. Добавьте: res.writeHead (200, {'Content-Type': 'application / json'}) перед
Али
13

Per JamieL «S ответ на другую должность :

Поскольку Express.js 3x у объекта ответа есть метод json (), который правильно устанавливает для вас все заголовки.

Пример:

res.json({"foo": "bar"});
Грег
источник
Как я могу сделать то же самое с файлом JSON?
HGB
не забывайте res.end (), если вы используете это, он мне нужен
Чарльз Харринг
3

в экспрессе могут быть средства форматирования JSON в области приложения.

посмотрев на express \ lib \ response.js, я использую эту процедуру:

function writeJsonPToRes(app, req, res, obj) {
    var replacer = app.get('json replacer');
    var spaces = app.get('json spaces');
    res.set('Content-Type', 'application/json');
    var partOfResponse = JSON.stringify(obj, replacer, spaces)
        .replace(/\u2028/g, '\\u2028')
        .replace(/\u2029/g, '\\u2029');
    var callback = req.query[app.get('jsonp callback name')];
    if (callback) {
        if (Array.isArray(callback)) callback = callback[0];
        res.set('Content-Type', 'text/javascript');
        var cb = callback.replace(/[^\[\]\w$.]/g, '');
        partOfResponse = 'typeof ' + cb + ' === \'function\' && ' + cb + '(' + partOfResponse + ');\n';
    }
    res.write(partOfResponse);
}
Амир Арад
источник
Это для отправки назад функций javascript? Я правильно понимаю? И зачем вам это делать? Просто любопытно
Sam Vloeberghs
1
const http = require('http');
const url = require('url');

http.createServer((req,res)=>{

    const parseObj =  url.parse(req.url,true);
    const users = [{id:1,name:'soura'},{id:2,name:'soumya'}]

    if(parseObj.pathname == '/user-details' && req.method == "GET") {
        let Id = parseObj.query.id;
        let user_details = {};
        users.forEach((data,index)=>{
            if(data.id == Id){
                user_details = data;
            }
        })
        res.writeHead(200,{'x-auth-token':'Auth Token'})
        res.write(JSON.stringify(user_details)) // Json to String Convert
        res.end();
    }
}).listen(8000);

Я использовал приведенный выше код в моем существующем проекте.

Dev216
источник