Skip to content

Provides functionality for converting JSON objects into a relational structure and then outputting to various formats (csv, markdown, html etc.)

License

Notifications You must be signed in to change notification settings

rogue-elephant/json-conversion-tool

Folders and files

NameName
Last commit message
Last commit date

Latest commit

0b9e8cf · Jun 7, 2020

History

39 Commits
Oct 17, 2019
Dec 9, 2019
Oct 17, 2019
Oct 16, 2019
Nov 13, 2019
Oct 16, 2019
Dec 9, 2019
Oct 16, 2019
Jun 7, 2020
Dec 9, 2019
Dec 8, 2019
Dec 4, 2019

Repository files navigation

JSON-CONVERSION-TOOL

NPM

json-conversion-tool npm

libraries io snyk

Github

Description

Provides functions for converting JSON objects to and from CSVs.

Try me out

Open in Gitpod

Usage

Example

const deeperPersonJson = [
    {
        id: 1,
        personalInfo: {
            firstName: 'John',
            lastName: 'Smith',
            title: 'Mr'
        },
        jobInfo: {
            department: 'HR',
            title: 'HR Assistant',
        },
        Awards: [
            {
                year: 2016,
                title: 'Best at Everything'
            }
        ]
    },
    {
        id: 2,
        personalInfo: {
            firstName: 'Jane',
            lastName: 'Doe',
            title: 'Mrs'
        },
        jobInfo: {
            department: 'Sales',
            title: 'Sales Executive',
        }
    },
    {
        id: 3,
        personalInfo: {
            firstName: 'John',
            lastName: 'Doe',
            title: 'Mr'
        },
        jobInfo: {
            department: 'R&D',
            title: 'Data Scientist',
        },
        warnings: [
            {
                year: 2016,
                reason: 'Farted in the coffee machine'
            }
        ]
    },
];

const relationalJson: RelationalJson = new Converter().convertJson(DeeperPersonJson, {});
const outputGenerator = new OutputGenerator(relationalJson);
const csv = outputGenerator.generateCsv();
const markdown = outputGenerator.generateMarkdown();
const html = outputGenerator.generateOutput({
  columnSeperator: '',
  tableLevelCallback: (output: string, table: RelationalJson) =>
    output + `<h1>${table.title}</h1>` + '<table><tr>' + table.columnNames.map(x => `<th>${x}</th>`).join('') + '</tr>',
  rowLevelCallback: (rowCol: IRowValue) => `<td>${rowCol.value}</td>`,
  rowStartOutput: '<tr>',
  rowEndOutput: '</tr>',
  tableEndOutput: '</table>',
  tableSpacing: '<br>',
});

CSV Output

id,personalInfo.firstName,personalInfo.lastName,personalInfo.title,jobInfo.department,jobInfo.title,Awards,warnings
1,John,Smith,Mr,HR,HR Assistant,1,
2,Jane,Doe,Mrs,Sales,Sales Executive,,
3,John,Doe,Mr,R&D,Data Scientist,,1

Awards
year,title
2016,Best at Everything

warnings
year,reason
2016,Farted in the coffee machine

Markdown Output


Converted JSON

id personalInfo.firstName personalInfo.lastName personalInfo.title jobInfo.department jobInfo.title Awards warnings
1 John Smith Mr HR HR Assistant 1
2 Jane Doe Mrs Sales Sales Executive
3 John Doe Mr R&D Data Scientist 1

Awards

year title
2016 Best at Everything

warnings

year reason
2016 Farted in the coffee machine

HTML (custom) Output

<h1>Converted JSON</h1>
<table>
    <tr>
        <th>id</th>
        <th>personalInfo.firstName</th>
        <th>personalInfo.lastName</th>
        <th>personalInfo.title</th>
        <th>jobInfo.department</th>
        <th>jobInfo.title</th>
        <th>Awards</th>
        <th>warnings</th>
    </tr>
    <tr>
        <td>1</td>
        <td>John</td>
        <td>Smith</td>
        <td>Mr</td>
        <td>HR</td>
        <td>HR Assistant</td>
        <td>1</td>
    </tr>
    <tr>
        <td>2</td>
        <td>Jane</td>
        <td>Doe</td>
        <td>Mrs</td>
        <td>Sales</td>
        <td>Sales Executive</td>
    </tr>
    <tr>
        <td>3</td>
        <td>John</td>
        <td>Doe</td>
        <td>Mr</td>
        <td>R&D</td>
        <td>Data Scientist</td>
        <td>1</td>
    </tr>
</table>
<br>
<h1>Awards</h1>
<table>
    <tr>
        <th>year</th>
        <th>title</th>
    </tr>
    <tr>
        <td>2016</td>
        <td>Best at Everything</td>
    </tr>
</table>
<br>
<h1>warnings</h1>
<table>
    <tr>
        <th>year</th>
        <th>reason</th>
    </tr>
    <tr>
        <td>2016</td>
        <td>Farted in the coffee machine</td>
    </tr>
</table>

Dot notation

You can also specify specifc fields to get based on dot notation, such as:

new OutputGenerator({ new Converter().convertJson(apiJson,{whiteList: ['prefs.backgroundImageScaled.url'])});

Or

new OutputGenerator({ new Converter().convertJson(apiJson,{whiteList: ['name', 'cards.*'])});

Contributing

  • Clone the repo and run npm install.
  • Create a new feature branch: git checkout -b feature/your-feature-branch-name.
  • Write a test in the __tests__ folder for your feature.
  • Write the code to get the test passing, running npm run test.
  • Push your branch up and submit a pull request.

Note: I have configured a launch.json for vscode that should allow for playing around with anything in index.ts and hitting f5 to debug.

Publishing

  • npm version patch
  • npm publish

About

Provides functionality for converting JSON objects into a relational structure and then outputting to various formats (csv, markdown, html etc.)

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published