Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parse Array of JSON objects in NodeJS

I am wondering how can I parse Array of JSON objects in NodeJS?

I want to post JSON array to the server, and be able to use the received array as a regualar JavaScript array.

Thanks in advance.

This is my front-end part that I am converting Array to String using stringify function

document.getElementById("sendJson").addEventListener("click", function () {
    $.post("/echo", JSON.stringify(QuestionsArray), function (data) {
        alert(data);
    });
})

This my back-end part that I am trying to convert Array of JSON object to Array

app.post('/echo', function (req, res) {
    var Array = JSON.parse(JSON.stringify(req.toString()));
    res.end(Array[0]["QuestionText"].toString());
});

This is Array that I am trying to sent to the server:

[  
   {  
      "QuestionText":"What is your Name",
      "QuestionType":1
   },
   {  
      "QuestionText":"Where are you from",
      "QuestionType":2,
      "ChoiceList":[  
         "US",
         "UK"
      ]
   },
   {  
      "QuestionText":"Are you married",
      "QuestionType":3,
      "ChoiceList":[  
         "Yes",
         "No"
      ]
   }
]

Here is the source code

like image 293
Node.JS Avatar asked Feb 24 '15 22:02

Node.JS


People also ask

How do I parse an array of JSON objects in Node JS?

Example - Parsing JSONUse the JavaScript function JSON.parse() to convert text into a JavaScript object: const obj = JSON.parse('{"name":"John", "age":30, "city":"New York"}'); Make sure the text is in JSON format, or else you will get a syntax error.

Can I Stringify an array?

Stringify a JavaScript ArrayUse the JavaScript function JSON.stringify() to convert it into a string. const myJSON = JSON.stringify(arr); The result will be a string following the JSON notation.

Can a JSON file be an array?

Arrays in JSON are almost the same as arrays in JavaScript. In JSON, array values must be of type string, number, object, array, boolean or null. In JavaScript, array values can be all of the above, plus any other valid JavaScript expression, including functions, dates, and undefined.


3 Answers

I'll try to explain this. First of all, you are crating a json string on the client.

JSON.stringify(QuestionsArray)

Then on the server, you are doing the same again:

JSON.stringify(req.toString()) // this is not needed

Then you parse the double stringifyed json string to a javascript object:

JSON.parse(JSON.stringify(req.toString()))

So now you actually have to parse it twice :). If you just stringify it on the server as you are now, and just call:

var arr = JSON.parse(req.toString());

You will get a javascript object that you can access like this:

res.end(arr[0].QuestionText.toString());

Have a look at this jsFiddle and open your developer tools. Look at the console when it runs and you will see where the problem is: example

like image 199
cfs Avatar answered Oct 25 '22 03:10

cfs


In your app.js:

var bodyParser = require("body-parser");
...
app.use(bodyParser.urlencoded({extended: true}));

Then you can just use req.body to get the posted values:

app.post('/echo', function (req, res) {
    var Array = req.body.data;
    res.end(Array[0]["QuestionText"].toString());
});

In front-end, don't do any stringifying:

$.post("/echo", {data: QuestionsArray}, function (data) {
    alert(data);
});
like image 10
Vsevolod Goloviznin Avatar answered Oct 25 '22 04:10

Vsevolod Goloviznin


You may actually send the JSON directly to server.

    $.ajax({
        url: "/echo",
        type: 'POST',
        data: JSON.stringify(QuestionsArray),
        processData: false,
        contentType: 'application/json'
    }).success(function (data) {
        alert(data);
    });

And in node.js, use bodyParser.json to get it back.

app.use(bodyParser.json({}));

app.post('/echo', function (req, res) {
    var array = req.body;
    res.end(array[0]["QuestionText"].toString());
});

By the way, do not use Array as variable name because Array represent the Array class used by JavaScript and your code has overwritten it.

like image 2
Alex Lau Avatar answered Oct 25 '22 04:10

Alex Lau