Respondendo com um objeto JSON em Node.js (convertendo objeto / array em string JSON)

98

Eu sou um newb para código de back-end e estou tentando criar uma função que responderá a mim uma string JSON. Atualmente, tenho isso de um exemplo

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();
}

Isso basicamente imprime a string "números aleatórios que devem vir na forma de JSON". O que eu quero fazer é responder com uma string JSON de quaisquer números. Eu preciso colocar um tipo de conteúdo diferente? esta função deve passar esse valor para outra pessoa dizer do lado do cliente?

Obrigado pela ajuda!

climboide
fonte
res.json ({"Chave": "Valor"});
Amol M Kulkarni,

Respostas:

161

Usando res.json com 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"
  });
}

Alternativamente:

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);
}
Kevin reilly
fonte
76
var objToJson = { };
objToJson.response = response;
response.write(JSON.stringify(objToJson));

Se alert(JSON.stringify(objToJson))você vai conseguir{"response":"value"}

druveen
fonte
Esteja ciente de que res.write (JSON.stringify ()) ainda espera que você "termine" a resposta. (reenviar()) ; expresso .json () para isso para você
131 de
22

Você deve usar a JSON.stringify()função incluída com o motor V8 que o nó usa.

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

Edit: Pelo que eu sei, a IANA registrou oficialmente um tipo MIME para JSON como application/jsonem RFC4627 . Ele também está listado na lista Tipo de mídia da Internet aqui .

Tyronegcarter
fonte
O cabeçalho do tipo de conteúdo também deve ser definido como application / json ou algo parecido? Qual é a melhor prática para isso?
e comercial de
1
Sim, para torná-la uma resposta válida, o cliente entenderá. Adicione: res.writeHead (200, {'Content-Type': 'application / json'}) before
Ali
12

Por JamieL 's resposta para outro post :

Desde Express.js 3x, o objeto de resposta tem um método json () que define todos os cabeçalhos corretamente para você.

Exemplo:

res.json({"foo": "bar"});
Greg
fonte
Como posso fazer o mesmo com um arquivo JSON?
HGB
não se esqueça de res.end () se você usar isso, eu precisava
Charles Harring
2

no expresso, pode haver formatadores JSON com escopo de aplicativo.

depois de examinar express \ lib \ response.js, estou usando esta rotina:

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);
}
Amir Arad
fonte
É para enviar de volta funções javascript? Estou entendendo direito? E por que você faria isso? Só por curiosidade
Sam Vloeberghs
0
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);

Usei o código acima em meu projeto existente.

Dev216
fonte