Guides

How to Parse Exported JSON Containing Image Data into CSV

If you need to process metadata exported from Visual Layer, this code helps convert JSON files into CSV format.

Read Visual Layer exported json and parse it into a list of videos, video frames, their timestamp, and their category.
Here is an example json from export from VL:

{
  "info": {
    "schema_version": "1.1",
    "dataset": "Extreme",
    "description": "Exported from Extreme at Visual Layer",
    "dataset_url": "http://app.visual-layer.com/dataset/42e3b7ae-dd5e-11ef-9fca-1a226f3de670/data",
    "export_time": "2025-02-15T18:23:34.164184",
    "dataset_creation_time": "2025-01-24T18:35:57.719308",
    "exported_by": "Danny Bickson",
    "total_media_items": 56
  },
  "media_items": [
    {
      "media_id": "8621054d-1d23-4ca7-a7ca-65feb2c83eb1",
      "media_type": "video_frame",
      "file_name": "output_000001.jpg",
      "file_path": "7370082532203988000_7450129782785756438_2024-12-19_14:28:36.mp4/output_000001.jpg",
      "file_size": "48.27KB",
      "uniqueness_score": 0.4989460029187489,
      "height": 720,
      "width": 576,
      "url": "http://app.visual-layer.com/dataset/42e3b7ae-dd5e-11ef-9fca-1a226f3de670/data/image/8621054d-1d23-4ca7-a7ca-65feb2c83eb1",
      "cluster_id": "49997382-b7c3-4c83-83a3-fa4e0a586f2b",
      "metadata_items": [
        {
          "type": "video_info",
          "properties": {
            "video_name": "7370082532203988000_7450129782785756438_2024-12-19_14:28:36.mp4",
            "frame_timestamp": 0.0
          }
        },
        {
          "type": "issue",
          "properties": {
            "issue_type": "duplicates",
            "confidence": 0.977624,
            "duplicate_group_id": "35395121-5cb1-4a92-906f-dd4cb9ff62d3",
            "duplicate_threshold": 0.96
          }
        }
        // ...
      ]
    },
    {
      "media_id": "09848999-125f-4be9-8850-82dc16d23459",
      "media_type": "video_frame",
      "file_name": "output_000001.jpg",
      "file_path": "7370082532203988000_7461337604009495810_2025-01-18_19:20:39.mp4/output_000001.jpg",
      "file_size": "48.11KB",
      "uniqueness_score": 0.021566401816095697,
      "height": 720,
      "width": 576,
      "url": "http://app.visual-layer.com/dataset/42e3b7ae-dd5e-11ef-9fca-1a226f3de670/data/image/09848999-125f-4be9-8850-82dc16d23459",
      "cluster_id": "49997382-b7c3-4c83-83a3-fa4e0a586f2b",
      "metadata_items": [
        {
          "type": "video_info",
          "properties": {
            "video_name": "7370082532203988000_7461337604009495810_2025-01-18_19:20:39.mp4",
            "frame_timestamp": 0.0
          }
        },
        {
          "type": "issue",
          "properties": {
            "issue_type": "duplicates",
            "confidence": 0.977624,
            "duplicate_group_id": "35395121-5cb1-4a92-906f-dd4cb9ff62d3",
            "duplicate_threshold": 0.96
          }
        }
        // ...
      ]
    }
    // ...
  ]
}

Here is an example script to convert to csv

import json  
import pandas as pd  
import re

## Load JSON file

with open("metadata 8.json", "r") as f:  
    data = json.load(f)

## Prepare list for DataFrame

records = []

## Iterate over media items

for item in data.get("media_items", []):  
    video_name = None  
    frame_timestamp = None  
    categories = []  
    file_name = item.get("file_name", "")

	for metadata in item.get("metadata_items", []):
	    if metadata["type"] == "video_info":
 	        video_name = metadata["properties"].get("video_name")
 	        frame_timestamp = metadata["properties"].get("frame_timestamp")
 	    elif metadata["type"] == "image_label":
    	    categories.append(metadata["properties"].get("category_name"))

	# Extract frame number from file name
	match = re.search(r'output_(\d+).jpg', file_name)
	frame_number = int(match.group(1)) if match else None

	# Append record with categories as a list
	records.append({
	    "video_name": video_name,
	    "file_name": file_name,
	    "frame_number": frame_number,
	    "time_in_video": frame_timestamp,
	    "categories": categories
	})

## Convert to DataFrame

df = pd.DataFrame(records)  
print(df.tail())

Output:


IndexVideo NameFile NameFrame NumberTime in VideoCategories
517370082532203988000_7453155857585442070_2024-1...output_000001.jpg10.000000[blanket, person, man, mountain, peak, ridge, ...
527370082532203988000_7453516762223496470_2024-1...output_000001.jpg10.000000[blanket, foot, hill, person, mountain, ski sl...
537370082532203988000_7457153883383614742_2025-0...output_000002.jpg28.351707[blue, paddle, calm, clear, float, person, lag...
547370082532203988000_7460204779604692246_2025-0...output_000002.jpg28.333333[blanket, person, man, mountain, stone, skier,...
557370082532203988000_7462069977454071062_2025-0...output_000032.jpg3284.440002[blanket, building, mountain, snow, snowy, tra...