Responder con un objeto JSON en Node.js (convertir objeto / matriz a cadena JSON)

98

Soy un novato en el código de back-end y estoy tratando de crear una función que me responda con una cadena JSON. Actualmente tengo esto de un ejemplo

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

Básicamente, esto solo imprime la cadena "números aleatorios que deberían venir en forma de JSON". Lo que quiero que haga es responder con una cadena JSON de cualquier número. ¿Necesito poner un tipo de contenido diferente? ¿Debería esta función pasar ese valor a otro, por ejemplo, del lado del cliente?

¡Gracias por tu ayuda!

trepador
fuente
res.json ({"Clave": "Valor"});
Amol M Kulkarni

Respuestas:

160

Usando res.json con 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
fuente
76
var objToJson = { };
objToJson.response = response;
response.write(JSON.stringify(objToJson));

Si alert(JSON.stringify(objToJson))vas a conseguir{"response":"value"}

druveen
fuente
Tenga en cuenta que res.write (JSON.stringify ()) todavía espera a que "termine" la respuesta. (res.end ()); exprese .json () a esto para usted
131
22

Tienes que usar la JSON.stringify()función incluida con el motor V8 que usa el nodo.

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

Editar: Hasta donde yo sé, IANA ha registrado oficialmente un tipo MIME para JSON como application/jsonen RFC4627 . También aparece en la lista de tipos de medios de Internet aquí .

tyronegcarter
fuente
¿El encabezado de tipo de contenido también debería establecerse en application / json o algo así? ¿Cuál es la mejor práctica para esto?
ampersand
1
Sí, para que sea una respuesta válida, el cliente la entenderá. Agregar: res.writeHead (200, {'Content-Type': 'application / json'}) antes
Ali
12

Según la respuesta de JamieL a otra publicación :

Dado que Express.js 3x, el objeto de respuesta tiene un método json () que establece todos los encabezados correctamente para usted.

Ejemplo:

res.json({"foo": "bar"});
Greg
fuente
¿Cómo puedo hacer lo mismo con un archivo JSON?
HGB
no olvide res.end () si usa esto, lo necesitaba
Charles Harring
2

en express puede haber formateadores JSON de ámbito de aplicación.

después de mirar express \ lib \ response.js, estoy usando esta rutina:

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
fuente
¿Es esto para devolver funciones de JavaScript? ¿Estoy entendiendo esto bien? ¿Y por qué harías eso? Simplemente curioso
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);

He usado el código anterior en mi proyecto existente.

Dev216
fuente