loading...

Discussion on: Forgiving pretty-print

Collapse
eruizdechavez profile image
Erick Ruiz de Chavez

Here is a very basic formatter that will try to do some basic formatting to the JSON string. You can change the value of indentWith to any other string you want, I used -- to make it more obvious when testing it. The value of myJsonString is missing a " in a key, therefore it is a broken JSON.

const myJsonString = ` { "Account": { "Account Name": "Firefly", "Order": [ { "OrderID: "order103", "Product": [ { "Product Name": "Bowler Hat", "ProductID": 858383, "SKU": "0406654608", "Description": { "Colour": "Purple", "Width": 300, "Height": 200, "Depth": 210, "Weight": 0.75 }, "Price": 34.45, "Quantity": 2 }, { "Product Name": "Trilby hat", "ProductID": 858236, "SKU": "0406634348", "Description": { "Colour": "Orange", "Width": 300, "Height": 200, "Depth": 210, "Weight": 0.6 }, "Price": 21.67, "Quantity": 1 } ] }, { "OrderID": "order104", "Product": [ { "Product Name": "Bowler Hat", "ProductID": 858383, "SKU": "040657863", "Description": { "Colour": "Purple", "Width": 300, "Height": 200, "Depth": 210, "Weight": 0.75 }, "Price": 34.45, "Quantity": 4 }, { "ProductID": 345664, "SKU": "0406654603", "Product Name": "Cloak", "Description": { "Colour": "Black", "Width": 30, "Height": 20, "Depth": 210, "Weight": 2 }, "Price": 107.99, "Quantity": 1 } ] } ] } }`;
const indentWith = "--";

let currIndent = 0;

const prettyIsh = myJsonString.split("").reduce((result, char) => {
  result += char;

  if (char === "{" || char === "[") {
    currIndent++;
    result += "\n" + indentWith.repeat(currIndent);
  } else if (char === ",") {
    result += "\n" + indentWith.repeat(currIndent);
  } else if (char === "}" || char === "]") {
    currIndent--;
    result += "\n" + indentWith.repeat(currIndent);
  }

  return result;
}, "");

console.log(prettyIsh);

This will output the following string when run with node in the terminal:

{
-- "Account": {
---- "Account Name": "Firefly",
---- "Order": [
------ {
-------- "OrderID: "order103",
-------- "Product": [
---------- {
------------ "Product Name": "Bowler Hat",
------------ "ProductID": 858383,
------------ "SKU": "0406654608",
------------ "Description": {
-------------- "Colour": "Purple",
-------------- "Width": 300,
-------------- "Height": 200,
-------------- "Depth": 210,
-------------- "Weight": 0.75 }
------------,
------------ "Price": 34.45,
------------ "Quantity": 2 }
----------,
---------- {
------------ "Product Name": "Trilby hat",
------------ "ProductID": 858236,
------------ "SKU": "0406634348",
------------ "Description": {
-------------- "Colour": "Orange",
-------------- "Width": 300,
-------------- "Height": 200,
-------------- "Depth": 210,
-------------- "Weight": 0.6 }
------------,
------------ "Price": 21.67,
------------ "Quantity": 1 }
---------- ]
-------- }
------,
------ {
-------- "OrderID": "order104",
-------- "Product": [
---------- {
------------ "Product Name": "Bowler Hat",
------------ "ProductID": 858383,
------------ "SKU": "040657863",
------------ "Description": {
-------------- "Colour": "Purple",
-------------- "Width": 300,
-------------- "Height": 200,
-------------- "Depth": 210,
-------------- "Weight": 0.75 }
------------,
------------ "Price": 34.45,
------------ "Quantity": 4 }
----------,
---------- {
------------ "ProductID": 345664,
------------ "SKU": "0406654603",
------------ "Product Name": "Cloak",
------------ "Description": {
-------------- "Colour": "Black",
-------------- "Width": 30,
-------------- "Height": 20,
-------------- "Depth": 210,
-------------- "Weight": 2 }
------------,
------------ "Price": 107.99,
------------ "Quantity": 1 }
---------- ]
-------- }
------ ]
---- }
-- }