0

I've 2 files as below.

f1.json

{
"name":"user1"
}

f2.json

{
"name":"user2"
}

and here is my code snippet.

var fs = require("fs");

function readIt() {
  let combined = [];
  fs.readdir("jsonfiles", function (err, files) {
    files.forEach(function (file, index) {
      combined.push(fileread("jsonfiles/" + file));
    });

    fs.writeFile("test.json", combined.toString(), (err) => {
      if (err) console.log(err);
      console.log("Successfully Written to File.");
    });
  });
}

function fileread(filename) {
  var contents = fs.readFileSync(filename);
  return contents;
}

readIt();

when I run this, the resulting output is as below

{
  "name":"user1"
},
{
  "name":"user2"
}

but I want it to be

[
{
  "name":"user1"
},
{
  "name":"user2"
}
]

Please let me know where I'm going wrong.

Thanks

1

1 Answer 1

2

Instead of toString(), you should use JSON.stringify().

To see their different behavior, you can try this snippet:

var jsonArr = [{name: "Mia"}, {name: "Eddie"}];

// toString()
console.log(jsonArr.toString());

// JSON.stringify()
console.log(JSON.stringify(jsonArr));

JavaScript Array.prototype.toString() just prints out the elements of the array, excluding the array bracket, but JSON.stringify() prints whole Javascript object structure as a valid JSON.

As the fs.writeFile() in Node.JS needs/consumes buffer, so you need to store the JSON string result in a variable before using it.

let jsonArr = [{name: "Mia"}];
const jsonString = JSON.stringify(jsonArr);
fs.writeFile("data.json", jsonString, (err) => ...);
Sign up to request clarification or add additional context in comments.

2 Comments

Somehow It is returning a buffer since I'm reading from a file and doing it.
@user3872094 I have updated my answer. Please try again

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.