""" JSON to CSV Converter - HuggingFace Space Convert JSON data to CSV format with customizable options. """ import gradio as gr import json import csv import io def convert_json_to_csv(json_input, delimiter=",", quote_char='"', include_headers=True): """Convert JSON data to CSV format""" if not json_input.strip(): return "Please enter JSON data", "" try: # Parse JSON data = json.loads(json_input) # Handle different JSON structures if isinstance(data, dict): # If it's a single object, convert to list with one item data = [data] elif not isinstance(data, list): return "❌ Invalid JSON structure: Expected object or array", "" if not data: return "❌ Empty JSON array", "" # Get all unique keys from all objects all_keys = [] for item in data: if isinstance(item, dict): for key in item.keys(): if key not in all_keys: all_keys.append(key) # Create CSV content output = io.StringIO() writer = csv.writer(output, delimiter=delimiter, quotechar=quote_char, quoting=csv.QUOTE_MINIMAL) # Add headers if include_headers: writer.writerow(all_keys) # Add data rows for item in data: if isinstance(item, dict): row = [] for key in all_keys: value = item.get(key, "") # Handle nested objects/arrays if isinstance(value, (dict, list)): value = json.dumps(value) row.append(value) writer.writerow(row) else: writer.writerow([item]) csv_content = output.getvalue() output.close() success_msg = f"✅ Converted {len(data)} records to CSV\n" success_msg += f"📊 {len(all_keys)} columns detected\n" success_msg += f"📝 Columns: {', '.join(all_keys)}" return success_msg, csv_content except json.JSONDecodeError as e: return f"❌ Invalid JSON: {str(e)}", "" except Exception as e: return f"❌ Conversion error: {str(e)}", "" def convert_csv_to_json(csv_input, first_row_is_header=True, delimiter=","): """Convert CSV data to JSON format""" if not csv_input.strip(): return "Please enter CSV data", "" try: # Parse CSV lines = csv_input.strip().split('\n') reader = csv.reader(lines, delimiter=delimiter) rows = list(reader) if not rows: return "❌ Empty CSV data", "" result = [] if first_row_is_header: headers = rows[0] data_rows = rows[1:] else: # Generate headers max_cols = max(len(row) for row in rows) headers = [f"column_{i}" for i in range(max_cols)] data_rows = rows # Convert rows to objects for row in data_rows: if row: # Skip empty rows obj = {} for i, header in enumerate(headers): if i < len(row): value = row[i] # Try to convert to appropriate type if value.lower() in ('true', 'false'): value = value.lower() == 'true' elif value.isdigit(): value = int(value) else: try: value = float(value) except ValueError: pass obj[header] = value result.append(obj) json_output = json.dumps(result, indent=2) success_msg = f"✅ Converted {len(result)} records to JSON\n" success_msg += f"📊 {len(headers)} columns\n" success_msg += f"📝 Headers: {', '.join(headers)}" return success_msg, json_output except Exception as e: return f"❌ Conversion error: {str(e)}", "" # Gradio interface with gr.Blocks(title="JSON/CSV Converter") as demo: gr.Markdown(""" # 🔄 JSON/CSV Converter Convert between JSON and CSV formats with customizable options. **Features:** - JSON to CSV conversion - CSV to JSON conversion - Custom delimiters and quotes - Handles nested objects and arrays - Preserves data types """) with gr.Tabs(): with gr.TabItem("JSON → CSV"): with gr.Row(): with gr.Column(): json_input = gr.Textbox( label="JSON Input", placeholder='Enter JSON data (e.g., [{"name": "John", "age": 30}])', lines=10 ) with gr.Row(): delimiter = gr.Dropdown( choices=[",", ";", "\t", "|"], value=",", label="Delimiter" ) quote_char = gr.Dropdown( choices=['"', "'", ''], value='"', label="Quote Character" ) include_headers = gr.Checkbox( value=True, label="Include Headers" ) json_to_csv_btn = gr.Button("Convert to CSV", variant="primary") with gr.Column(): json_result = gr.Textbox(label="Conversion Status", lines=3) csv_output = gr.Textbox( label="CSV Output", lines=10, interactive=False ) with gr.TabItem("CSV → JSON"): with gr.Row(): with gr.Column(): csv_input = gr.Textbox( label="CSV Input", placeholder="name,age,city\nJohn,30,New York\nJane,25,Boston", lines=10 ) with gr.Row(): csv_delimiter = gr.Dropdown( choices=[",", ";", "\t", "|"], value=",", label="Delimiter" ) first_row_header = gr.Checkbox( value=True, label="First Row is Header" ) csv_to_json_btn = gr.Button("Convert to JSON", variant="primary") with gr.Column(): csv_result = gr.Textbox(label="Conversion Status", lines=3) json_output = gr.Textbox( label="JSON Output", lines=10, interactive=False ) # Event handlers json_to_csv_btn.click( fn=convert_json_to_csv, inputs=[json_input, delimiter, quote_char, include_headers], outputs=[json_result, csv_output] ) csv_to_json_btn.click( fn=convert_csv_to_json, inputs=[csv_input, first_row_header, csv_delimiter], outputs=[csv_result, json_output] ) if __name__ == "__main__": demo.launch()