sodcalculator

10 Tech How-To

JSON Graph Viewer: Turn Data into Interactive Network

Guide 10-7927 · Updated · Step by step

This guide shows you how to build an in-browser JSON graph viewer that transforms structured JSON data into an interactive network visualization. You’ll learn to parse JSON, map nodes and edges, and render a clickable, draggable graph using a JavaScript library like vis.js or Cytoscape.js. By the end, you’ll have a reusable HTML file that loads your data and displays it as a dynamic network.

What You’ll Need

  • A text editor (VS Code, Sublime, or Notepad++)
  • A modern web browser (Chrome, Firefox, Edge)
  • Basic knowledge of HTML, CSS, and JavaScript
  • A JSON file containing graph data (nodes and edges) — see the example below
  • Internet connection to load CDN libraries (or download them locally)

Step-by-Step

  1. Prepare your JSON data. Structure it as an object with two arrays: nodes and edges. Each node needs a unique id and a label. Each edge needs from and to values that match node IDs. Example:
    {
      "nodes": [
        { "id": 1, "label": "Alice" },
        { "id": 2, "label": "Bob" },
        { "id": 3, "label": "Carol" }
      ],
      "edges": [
        { "from": 1, "to": 2 },
        { "from": 2, "to": 3 }
      ]
    }
  2. Create the HTML skeleton. Open your text editor and create a new file called graph-viewer.html. Add the basic HTML5 structure with a <div> where the graph will render, and a <input type="file"> to load your JSON file.
  3. Include a graph library. Use a CDN link for vis.js (or Cytoscape.js). For vis.js, add this in the <head>:
    <link rel="stylesheet" href="https://unpkg.com/vis-network/styles/vis-network.min.css" />
    <script src="https://unpkg.com/vis-network/standalone/umd/vis-network.min.js"></script>
  4. Write the JavaScript to load and parse JSON. Use FileReader to read the uploaded file, then JSON.parse() to convert it into an object. Validate that the object has nodes and edges arrays.
  5. Create the network. Instantiate a vis.Network object, passing the container div and the data object. Example:
    const container = document.getElementById('mynetwork');
    const data = { nodes: new vis.DataSet(parsedData.nodes), edges: new vis.DataSet(parsedData.edges) };
    const options = {};
    const network = new vis.Network(container, data, options);
  6. Add interactivity. Enable physics for smooth dragging, and add click events to display node details. For example, use network.on('click', function(params) { ... }) to show the selected node’s label in a side panel.
  7. Style the viewer. Use CSS to give the container a fixed height (e.g., height: 600px) and a border. Optionally, add a toolbar with zoom controls or a search box.
  8. Test with your data. Save the HTML file, open it in a browser, upload your JSON, and verify the graph appears. Drag nodes to see physics in action, and click to inspect node properties.

Common Mistakes

  • Missing ‘id’ fields: Every node must have a unique id, otherwise the library throws errors or renders incorrectly.
  • Edges referencing non-existent nodes: Ensure every from and to value matches a node ID. Otherwise, edges may be ignored.
  • Using JSON arrays instead of objects: The top-level must be an object with nodes and edges keys, not a bare array.
  • Forgetting to set container height: If the container div has zero height, the graph won’t display. Always set an explicit height in CSS.
  • Not handling file read errors: If the JSON is malformed, the script crashes silently. Add try/catch and alert the user.

Tips

  • Use a DataSet for large graphs: It allows efficient updates and improves performance with thousands of nodes.
  • Customize node colors and sizes based on data attributes (e.g., color: { background: node.group }).
  • Enable clustering for big networks to keep the view readable. In vis.js, set options: { clustering: true }.
  • Add a legend to explain node colors or shapes.
  • Export the view as an image using network.canvasToImage() for sharing.

Troubleshooting

  • Graph doesn’t appear at all: Check the browser console (F12) for errors. Verify the CDN links are correct and that the container has height.
  • Nodes are invisible or all overlapping: This often happens when physics is disabled. Enable physics in options, or manually set positions in the data.
  • Edges not showing: Confirm that edge IDs are not required (they aren’t), and that from/to values are numbers or strings matching node IDs.
  • File upload doesn’t work: Ensure the input has type="file" and that you’re using FileReader correctly. Test with a simple known JSON file.
  • Performance is slow with many nodes: Reduce physics iterations, disable smooth edges, or use the hierarchical layout.

Frequently Asked Questions

Can I use this viewer without uploading a file?

Yes, you can embed the JSON directly in a <script> tag as a JavaScript object, or fetch it from a URL using fetch().

What if my JSON has a different structure?

You’ll need to adapt the parsing logic. For example, if nodes are nested inside a data key, adjust the code to access parsedData.data.nodes.

Can I edit the graph in the browser?

Yes, vis.js allows editing if you enable manipulation in options. You can add or delete nodes and edges interactively.

How do I handle directed vs undirected edges?

By default, vis.js draws arrows for directed edges. Set arrows: 'to' in the edges options, or omit it for undirected.

Can I use this with Cytoscape.js instead?

Yes, the steps are similar. Cytoscape.js expects a different data format (elements array), but the concept of nodes and edges is the same.

Is it possible to save the modified graph back to JSON?

Yes, you can use network.getNodes() and network.getEdges() to retrieve the current state and serialize it back to JSON.

Related

General steps for current mainstream versions; menus can differ by device and version. See the disclaimer or report an error.

More in this bed

The whole Tech How-To bed →