"use client"; import React, { useState, useCallback } from 'react'; import { Code, Minimize2, CheckCircle, Copy, FilePlus, Eraser, Check, XCircle } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { toast } from "sonner"; type Mode = 'format' | 'compress' | 'validate'; export default function JsonFormatterPage() { const [mode, setMode] = useState('format'); const [inputJson, setInputJson] = useState(''); const [outputJson, setOutputJson] = useState(''); const [isValid, setIsValid] = useState(null); const [errorMsg, setErrorMsg] = useState(''); const [charCount, setCharCount] = useState(0); const validateJson = useCallback((jsonStr: string) => { if (!jsonStr.trim()) { setIsValid(null); setErrorMsg(''); return null; } try { const parsed = JSON.parse(jsonStr); setIsValid(true); setErrorMsg(''); return parsed; } catch (err) { const msg = err instanceof Error ? err.message : '未知错误'; setErrorMsg(msg); setIsValid(false); return null; } }, []); const formatJson = useCallback(() => { const parsed = validateJson(inputJson); if (parsed !== null) { const formatted = JSON.stringify(parsed, null, 2); setOutputJson(formatted); toast.success('格式化成功'); } }, [inputJson, validateJson]); const compressJson = useCallback(() => { const parsed = validateJson(inputJson); if (parsed !== null) { const compressed = JSON.stringify(parsed); setOutputJson(compressed); toast.success('压缩成功'); } }, [inputJson, validateJson]); const validateOnly = useCallback(() => { validateJson(inputJson); if (inputJson.trim() && isValid) { toast.success('JSON 格式正确'); } }, [inputJson, validateJson, isValid]); const handleAction = useCallback(() => { switch (mode) { case 'format': formatJson(); break; case 'compress': compressJson(); break; case 'validate': validateOnly(); break; } }, [mode, formatJson, compressJson, validateOnly]); const copyToClipboard = useCallback(async (text: string, type: string) => { if (!text) { toast.warning('没有可复制的内容'); return; } try { await navigator.clipboard.writeText(text); toast.success(`${type}已复制`); } catch { toast.error('复制失败'); } }, []); const clearAll = useCallback(() => { setInputJson(''); setOutputJson(''); setIsValid(null); setErrorMsg(''); setCharCount(0); }, []); const loadExample = useCallback(() => { const example = { name: "信奥工具箱", version: "1.0.0", features: ["JSON格式化", "压缩", "验证"], config: { theme: "cyan", language: "zh-CN" } }; const exampleStr = JSON.stringify(example, null, 2); setInputJson(exampleStr); setCharCount(exampleStr.length); validateJson(exampleStr); }, [validateJson]); const handleInputChange = useCallback((value: string) => { setInputJson(value); setCharCount(value.length); if (value.trim()) { validateJson(value); } else { setIsValid(null); setErrorMsg(''); } }, [validateJson]); return (
{/* Page Header */}

JSON 格式化工具

格式化JSON,使其更易读

setMode(v as Mode)} className="w-75"> 格式化 压缩 验证
{/* Action Bar */} {/* Main Content */}
{/* Input Panel */} JSON 输入 复制输入 {isValid !== null && ( {isValid ? : } {isValid ? '格式正确' : '格式错误'} )}