Convert json array to html table

 1. Suppose you have a json array, or data in a List Map which is displayed in a ListView.

e.g. fruits.json file in assets folder

To read it and set the json array to a string variable:

a) Add a method to read assets file:


public String _readJsonFromAsset(final String _filename) {

		String json = null;

		try {

			InputStream is = this.getAssets().open(_filename);

			int size = is.available();

			byte[] buffer = new byte[size];

			is.read(buffer);

			is.close();

			json = new String(buffer, StandardCharsets.UTF_8);

		} catch (IOException ex) {

			ex.printStackTrace();

			return null;

		}

		return json;

		
	}

For above method, in Sketchware, you can create a more block readJsonFromAsset of type String and with a String variable filename. Then put codes below.


    String json = null;
    try {
        InputStream is = this.getAssets().open(_filename);
        int size = is.available();
        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();
        json = new String(buffer, StandardCharsets.UTF_8);
    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }
    return json;

  


b) In onCreate, read json, convert it to ListMap (fruitList) and display it in ListView.


String json_data = _readJsonFromAsset("fruits.json");

fruitList = new Gson().fromJson(json_data, new TypeToken<ArrayList<HashMap<String, Object>>>(){}.getType());

		binding.listview1.setAdapter(new Listview1Adapter(fruitList));

		((BaseAdapter)binding.listview1.getAdapter()).notifyDataSetChanged();
    

2. Add a Button btn_table. Also add an Intent component intent.

3. Add a new page table.xml, and add a WebView webview1 in it.

4. In btn_table onClick, use intent to move to TableActivity. Set the json data and title as extra keys.



String json_data = _readJsonFromAsset("fruits.json");

Intent intent = new Intent();
intent.setClass(getApplicationContext(), TableActivity.class);
intent.putExtra("json", json_data);
intent.putExtra("title", "FRUIT LIST");
startActivity(intent);

    

Or Using blocks as in one of the images shown below.







5. In asset manager, create a file index.html and put following codes.



<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>JSON Table Viewer</title>
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <div class="container">
    <div class="controls">
      <button onclick="printLandscape()">Print Table</button>
    </div>

    <h2 id="titleDisplay">My JSON Table</h2>
    <table id="dataTable"></table>
  </div>

  <script src="script.js"></script>
</body>
</html>

6. Create another file style.css in assets folder and put following codes in it.



body {
  font-family: Arial, sans-serif;
  background: #f2f2f2;
  margin: 0;
  padding: 0;
}

.container {
  max-width: 90%;
  margin: 40px auto;
  background: #fff;
  padding: 10px 20px;
  border-radius: 12px;
  box-shadow: 0 0 8px rgba(0, 0, 0, 0.1);
  overflow-x: auto; /* ✅ Horizontal scroll for wide tables */
}

table {
  width: 100%;
  border-collapse: collapse;
  table-layout: auto;
  word-wrap: break-word;
}

th, td {
  border: 1px solid #ccc;
  padding: 10px;
  text-align: left;
  white-space: nowrap;
}

@media (max-width: 768px) {
  th, td {
    white-space: normal;
  }
}

.controls {
  display: flex;
  align-items: center;
  justify-content: center; /* ✅ center the button horizontally */
  gap: 10px;
  margin: 10px auto 20px;
  padding: 0 16px;
  width: 90%;
  box-sizing: border-box;
}

button {
  padding: 8px 14px;
  border: none;
  background-color: #007bff;
  color: white;
  border-radius: 8px;
  cursor: pointer;
  font-size: 15px;
}

button:hover {
  background-color: #0056b3;
}

#titleDisplay {
  text-align: center;
  margin-bottom: 20px;
  font-weight: bold;
  font-size: 20px;
}

/* Landscape print style */
@media print {
  @page {
    size: landscape;
    margin: 20mm;
  }

  body {
    background: white;
  }

  .controls {
    display: none;
  }

  #titleDisplay {
    font-size: 18px;
    font-weight: bold;
    text-align: center;
    margin-bottom: 15px;
  }
}

7. Create script.js file in assets folder and put following codes in it.



// Get query parameter
function getQueryParam(param) {
  const urlParams = new URLSearchParams(window.location.search);
  return urlParams.get(param);
}

// Load JSON data into table
function loadTable(jsonData) {
  const table = document.getElementById("dataTable");
  table.innerHTML = "";

  if (!jsonData || jsonData.length === 0) return;

  const headers = Object.keys(jsonData[0]);
  const headerRow = table.insertRow();

  headers.forEach(header => {
    if (header.toLowerCase() === "id" || header.toLowerCase() === "uid") return;

    const th = document.createElement("th");
    const cleanHeader = header.replaceAll("_", " ");
    const formattedHeader = cleanHeader.charAt(0).toUpperCase() + cleanHeader.slice(1);
    th.textContent = formattedHeader;
    headerRow.appendChild(th);
  });

  jsonData.forEach(item => {
    const row = table.insertRow();
    headers.forEach(header => {
      if (header.toLowerCase() === "id" || header.toLowerCase() === "uid") return;
      const cell = row.insertCell();
      cell.textContent = item[header];
    });
  });
}

// Print table in landscape with title
function printLandscape() {
  const title = document.getElementById("titleDisplay").textContent;
  const printWindow = window.open("", "_blank");
  const tableHTML = `
    <html>
      <head>
        <title>${title}</title>
        <style>
          @page { size: landscape; margin: 20mm; }
          body { font-family: Arial, sans-serif; background: white; }
          h2 { text-align: center; font-weight: bold; margin-bottom: 15px; }
          table { width: 100%; border-collapse: collapse; }
          th, td { border: 1px solid #ccc; padding: 10px; text-align: left; }
          th { background-color: #007bff; color: white; }
        </style>
      </head>
      <body>
        <h2>${title}</h2>
        ${document.getElementById("dataTable").outerHTML}
      </body>
    </html>
  `;
  printWindow.document.write(tableHTML);
  printWindow.document.close();
  printWindow.focus();
  printWindow.print();
}

// Load data when page starts
window.onload = async function () {
  const dataParam = getQueryParam("data");
  const dataUrl = getQueryParam("dataUrl");
  const dataTitle = getQueryParam("title");
  const titleDisplay = document.getElementById("titleDisplay");

  if (dataTitle) titleDisplay.textContent = dataTitle;

  try {
    if (dataParam) {
      const decoded = decodeURIComponent(dataParam);
      const jsonData = JSON.parse(decoded);
      loadTable(jsonData);
    } else if (dataUrl) {
      const response = await fetch(dataUrl);
      const jsonData = await response.json();
      loadTable(jsonData);
    } else {
      const sampleData = [
        { Name: "John Doe", Age: 30, City: "New York" },
        { Name: "Jane Smith", Age: 25, City: "London" },
        { Name: "Michael Lee", Age: 35, City: "Sydney" },
        { Name: "Sita Patel", Age: 28, City: "Mumbai" }
      ];
      loadTable(sampleData);
    }
  } catch (err) {
    console.error("Error loading JSON:", err);
    document.getElementById("dataTable").innerHTML = "<tr><td>Error loading JSON</td></tr>";
  }
};

8. In TableActivity onCreate event, load the json in WebView.




The codes used in add source directly block:



binding.webview1.getSettings().setJavaScriptEnabled(true);

binding.webview1.loadUrl("file:///android_asset/index.html?data=" + json + "&title=" + title);


Post a Comment

0 Comments