How to Display JSON Data in React

React is a popular JavaScript library for building user interfaces. It provides a powerful and efficient way to create dynamic web applications. One common task in web development is displaying data from an API or a backend server. In this article, we will explore how to display JSON data in a React application.

Understanding JSON

JSON, which stands for JavaScript Object Notation, is a lightweight data interchange format. It is commonly used to transmit data between a server and a web application. JSON data is organized in a key-value format and is often used to represent complex objects and arrays.

Fetching JSON Data

Before we can display JSON data in a React application, we need to fetch it from an API or a server. React provides the fetch API, which is a modern and powerful way to make HTTP requests. Here’s an example of how to fetch JSON data in React:

import React, { useEffect, useState } from 'react';

function App() {
  const [jsonData, setJsonData] = useState(null);

  useEffect(() => {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => setJsonData(data))
      .catch(error => console.error(error));
  }, []);

  return (
    <div>
      {/* Display the JSON data here */}
    </div>
  );
}

export default App;

In the above code, we use the fetch function to make an HTTP GET request to the specified URL. Once the response is received, we convert it to JSON format using the .json() method. The resulting JSON data is then stored in the jsonData state variable using the setJsonData function.

Rendering JSON Data

Now that we have fetched the JSON data and stored it in the state, we can proceed to render it in our React components. React provides a flexible and efficient way to render dynamic data using JSX, a syntax extension for JavaScript. Here’s how we can render the JSON data in our example:

return (
  <div>
    {jsonData && (
      <ul>
        {jsonData.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
    )}
  </div>
);

In the above code, we use conditional rendering to ensure that the JSON data is available before attempting to render it. We map over the jsonData array and render a list item (<li>) for each item in the array. The key prop is important to provide a unique identifier for each rendered item.

Handling Loading and Error States

When fetching data in a React application, it’s essential to handle loading and error states to provide a better user experience. Here’s an example of how to handle these states:

function App() {
  const [jsonData, setJsonData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => {
        setJsonData(data);
        setLoading(false);
      })
      .catch(error => {
        setError(error);
        setLoading(false);
      });
  }, []);

  if (loading) {
    return <div>Loading...</div>;
  }

  if (error) {
    return <div>Error: {error.message}</div>;
  }

  return (
    <div>
      {jsonData && (
        <ul>
          {jsonData.map(item => (
            <li key={item.id}>{item.name}</li>
          ))}
        </ul>
      )}
    </div>
  );
}

In this updated code, we introduce two additional state variables: loading and error. The loading variable is set to true initially and is set to false once the data is fetched. The error variable captures any errors that occur during the data fetching process.

We use conditional rendering to display appropriate messages based on the current state. If loading is true, we display a loading message. If error is not null, we display an error message along with the error details. Otherwise, we render the JSON data as before.

author's bio photo

Hi there! I am Avic Ndugu.

I have published 100+ blog posts on HTML, CSS, Javascript, React and other related topics. When I am not writing, I enjoy reading, hiking and listening to podcasts.