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!


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

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

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


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 .


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

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

É 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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.