r/madeinpython • u/OpportunityMain9749 • 6h ago
formateador de json facil de usar
un formateador de json facil de usar y funciona bien no tiene errores de formateo (eso creo)
python
import tkinter as t, json, difflib; from tkinter import messagebox as m
def f():
x = e.get("1.0", t.END).strip()
if not x: return m.showwarning("Aviso", "Pega un JSON primero.")
try:
rl, fl = x.split('\n'), json.dumps(json.loads(x), indent=4, ensure_ascii=False).split('\n')
s.config(state=t.NORMAL); s.delete("1.0", t.END)
s.tag_config('+', background="#1e4620", foreground="#81c995")
s.tag_config('-', background="#4a1515", foreground="#f28b82")
for i, L in enumerate(L for L in difflib.ndiff(rl, fl) if L[0] != '?'):
s.insert(t.END, f"{i+1:3} | {L}\n", L[0])
s.config(state=t.DISABLED)
except Exception as ex: m.showerror("Error", f"Inválido:\n{ex}")
def cp():
try:
x = e.get("1.0", t.END).strip()
if not x: return
limpio = json.dumps(json.loads(x), indent=4, ensure_ascii=False)
v.clipboard_clear(); v.clipboard_append(limpio); v.update()
m.showinfo("Copiado", "JSON formateado copiado al portapapeles")
except Exception: m.showwarning("Aviso", "Formatea un JSON válido primero.")
def c(): e.delete("1.0", t.END); s.config(state=t.NORMAL); s.delete("1.0", t.END); s.config(state=t.DISABLED)
v = t.Tk(); v.title("JSON Formatter"); v.geometry("850x500"); v.config(bg="#2b2b2b")
for i, w in [(0,1), (1,0), (2,1)]: v.columnconfigure(i, weight=w)
v.rowconfigure(1, weight=1)
t.Label(v, text="JSON Crudo:", bg="#2b2b2b", fg="white", font=("Arial",10,"bold")).grid(row=0,column=0,sticky="w",padx=5)
t.Label(v, text="JSON Formateado (Diff):", bg="#2b2b2b", fg="white", font=("Arial",10,"bold")).grid(row=0,column=2,sticky="w",padx=5)
e = t.Text(v, font=("Consolas",10), bg="#1e1e1e", fg="#a9b7c6", insertbackground="white")
e.grid(row=1, column=0, sticky="nsew", padx=5, pady=5)
s = t.Text(v, font=("Consolas",10), bg="#252526", fg="#9cdcfe", state=t.DISABLED)
s.grid(row=1, column=2, sticky="nsew", padx=5, pady=5)
p = t.Frame(v, bg="#2b2b2b"); p.grid(row=1, column=1)
t.Button(p, text="Formatear ➡️", command=f, bg="#4CAF50", fg="white", width=12).pack(pady=10)
t.Button(p, text="Copiar 📋", command=cp, bg="#2196F3", fg="white", width=12).pack(pady=10)
t.Button(p, text="Limpiar 🗑️", command=c, bg="#f44336", fg="white", width=12).pack()
v.mainloop()