Répondre avec un objet JSON dans Node.js (conversion d'un objet / tableau en chaîne JSON)


98

Je suis novice dans le code back-end et j'essaye de créer une fonction qui me répondra une chaîne JSON. J'ai actuellement ceci à partir d'un exemple

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

Cela imprime simplement la chaîne "nombres aléatoires qui devraient se présenter sous la forme de JSON". Ce que je veux faire, c'est répondre avec une chaîne JSON de n'importe quel nombre. Dois-je mettre un type de contenu différent? cette fonction devrait-elle transmettre cette valeur à un autre, disons du côté client?

Merci de votre aide!


res.json ({"Clé": "Valeur"});
Amol M Kulkarni

Réponses:


161

Utilisation de res.json avec 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"
  });
}

Alternativement:

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

Si vous alert(JSON.stringify(objToJson))obtenez{"response":"value"}


Attention, res.write (JSON.stringify ()) attend toujours que vous "terminiez" la réponse. (res.end ()); exprimer .json () à ceci pour vous
131

22

Vous devez utiliser la JSON.stringify()fonction incluse avec le moteur V8 utilisé par le nœud.

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

Edit: Autant que je sache, l' IANA a officiellement enregistré un type MIME pour JSON comme application/jsondans RFC4627 . Il est également répertorié dans la liste Type de média Internet ici .


L'en-tête de type de contenu devrait-il également être défini sur application / json ou quelque chose comme ça? Quelle est la meilleure pratique pour cela?
esperluette

1
Oui, pour en faire une réponse valide, le client comprendra. Ajouter: res.writeHead (200, {'Content-Type': 'application / json'}) avant
Ali

12

Selon la réponse de JamieL à un autre article :

Depuis Express.js 3x, l'objet de réponse a une méthode json () qui définit correctement tous les en-têtes pour vous.

Exemple:

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

Comment puis-je faire la même chose avec un fichier JSON?
HGB du

n'oubliez pas res.end () si vous utilisez ceci, j'en avais besoin
Charles Harring

2

dans express, il peut y avoir des formateurs JSON à portée d'application.

après avoir regardé express \ lib \ response.js, j'utilise cette routine:

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

Est-ce pour renvoyer des fonctions javascript? Est-ce que je comprends bien? Et pourquoi feriez-vous cela? Juste curieux
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);

J'ai utilisé le code ci-dessus dans mon projet existant.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.