2011-05-05 12 views
78

Soy un nuevo código de back-end y estoy tratando de crear una función que me responda una cadena json. En este momento tengo esto desde un ejemploRespondiendo con un objeto JSON en NodeJS (convirtiendo objeto/matriz en cadena 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(); 
} 

Esto, básicamente, sólo imprime la cadena "números aleatorios que deben venir en forma de JSON". Lo que quiero que esto sea hacer es responder con una cadena json de cualquier número. ¿Debo poner un tipo de contenido diferente? ¿esta función debe pasar ese valor a otro en el lado del cliente?

Gracias por su ayuda!

+0

res.json ({ "Key": "Valor"}); –

Respuesta

128

Usando res.json con expreso:

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

alternativa:

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

+1 para el tipo de contenido correcto – jszpila

+0

@Kevin Reilly Gracias, ¡me funciona! –

19

Debe utilizar la función JSON.stringify() incluida con el motor V8 que utiliza el nodo.

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

Editar: Por lo que yo sé, IANA ha registrado oficialmente un tipo MIME para JSON como application/json en RFC4627. También aparece en la lista Internet Media Typehere.

+0

¿Debería el encabezado content-type también establecerse en application/json o algo así? ¿Cuál es la mejor práctica para esto? – ampersand

+0

Sí, para que sea una respuesta válida, el cliente lo entenderá. Agregue: res.writeHead (200, {'Content-Type': 'application/json'}) antes de – Ali

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

Si alert(JSON.stringify(objToJson)) obtendrá {"response":"value"}

+0

Tenga cuidado de que res.write (JSON.stringify()) aún espere que finalice la respuesta. (res.end()); express .json() a esto para usted – 131

2

in rápido puede haber formateadores JSON de ámbito de aplicación.

después de mirar expresa \ 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); 
} 
+0

¿Esto es para enviar de vuelta funciones de JavaScript? ¿Estoy haciendo esto bien? ¿Y por qué harías eso? Sólo curiosidad –

+2

nevermind, lea el 'nombre de devolución de llamada jsonp' –

11

por JamieL 's answer-another post:

Desde Express.js 3x la respuesta objeto tiene un método json() que establece todos los encabezados correctamente para usted.

Ejemplo:

res.json({"foo": "bar"}); 
+0

¿Cómo puedo hacer lo mismo con un archivo JSON? – HGB