JSON เป็น TypeScript, Go, Python, PHP, Rust
ออกแบบเพื่อความเป็นส่วนตัว — ทำงานในเบราว์เซอร์ของคุณทั้งหมด
การอนุมานนิยามชนิดข้อมูลที่ถูกต้องจากการตอบสนอง API จริงเป็นหนึ่งในงานที่ควรใช้เวลาห้าวินาที แต่กลับกินเวลาสิบห้านาทีอยู่บ่อยครั้ง เครื่องมือนี้อ่านตัวอย่าง JSON ในเบราว์เซอร์ของคุณ เดินผ่านโครงสร้าง และผลิตชนิดข้อมูลที่เป็นสำนวนของภาษาสำหรับ TypeScript, Go, Python, PHP หรือ Rust พร้อมฟิลด์เสริม การตรวจจับวันที่ ISO และการแยกแยะจำนวนเต็มกับจำนวนทศนิยมอย่างถูกต้อง
การอนุมานทำงานอย่างไร
เครื่องมือเดินผ่านต้นไม้ JSON หนึ่งครั้ง สร้างการแทนค่าระดับกลาง: ค่าพื้นฐานกลายเป็น string / int / float / bool / null, อาร์เรย์อนุมานชนิดของอีลีเมนต์จากผลรวมของสมาชิก และอ็อบเจ็กต์สร้าง struct ที่ชนิดของฟิลด์มาจากค่า เมื่อฟิลด์เดียวกันปรากฏในบางอีลีเมนต์ของอาร์เรย์แต่ไม่ในที่อื่น ฟิลด์นั้นจะถูกทำเครื่องหมายเป็นเสริม ทำให้ชนิดที่สร้างขึ้นสามารถถอดรหัสข้อมูลบางส่วนได้โดยไม่พัง ตัวเลขที่ไม่มีส่วนทศนิยมจะออกเป็น int64 (Go) / int (Python) / i64 (Rust) ส่วนที่มีจะเป็น float64 / float / f64 สตริงที่ตรงรูปแบบ ISO 8601 (`2024-03-15T10:30:00Z`) จะกลายเป็น Date / time.Time / datetime / DateTimeInterface / chrono::DateTime
รูปแบบเอาต์พุตต่อภาษา
ตัวสร้างของแต่ละภาษาทำตามขนบของภาษาเป้าหมาย TypeScript: interface ที่ส่งออกพร้อมไวยากรณ์ `?:` Go: struct พร้อมแท็ก `json:` ฟิลด์เสริมเป็นพอยเตอร์พร้อม `omitempty` Python: `@dataclass` โดยฟิลด์บังคับมาก่อนและ `Optional[T] = None` ตามหลัง (กฎการเรียงของ dataclass) PHP: คลาส final ที่มี strict types พร้อม phpdoc `@var list<T>` สำหรับอาร์เรย์ที่มีชนิด Rust: struct ที่ใช้ `#[derive(Serialize, Deserialize)]`, `Option<T>` สำหรับฟิลด์ที่เป็น null ได้ และ `#[serde(rename)]` เมื่อชื่อ snake_case ของ Rust ต่างจากคีย์ JSON
เมื่อไรควรใช้ (และไม่ควรใช้)
ตัวสร้างนี้แก้ปัญหา 80% แรกของงาน คือได้นิยามชนิดข้อมูลที่ใช้งานได้จาก payload ภายในไม่กี่วินาที ไม่แทนที่ schema ที่เขียนด้วยมือเมื่อคุณต้องการข้อจำกัดที่แม่นยำ (regex บนสตริง, min/max บนตัวเลข, union แบบมีตัวแยก) สำหรับกรณีนั้น ใช้เอาต์พุตเป็นจุดเริ่มต้นและกระชับชนิดข้อมูล การตรวจจับฟิลด์เสริมเป็น heuristic ขึ้นกับสิ่งที่อยู่ในตัวอย่าง ดังนั้นให้ผ่านตัวอย่างหลากหลายหากทำได้
คำถามที่พบบ่อย
- JSON ที่ฉันวางจะออกจากเบราว์เซอร์ของฉันไหม?
- ไม่ ตัวแยกวิเคราะห์ การอนุมานชนิด และการสร้างโค้ดทั้งหมดทำงานใน JavaScript ในแท็บของคุณ เปิดแผง Network ขณะสร้าง คุณจะเห็นคำขอออก 0 รายการ ปลอดภัยสำหรับ payload ที่มีโทเค็นจริงและ PII
- ทำไมฟิลด์ของฉันถูกทำเครื่องหมายเป็นเสริมทั้งที่มีค่าเสมอ?
- แฟล็กเสริมถูกตั้งเมื่ออาร์เรย์มีอ็อบเจ็กต์ที่มีฟิลด์นั้นและบางอ็อบเจ็กต์ที่ไม่มี หากคุณวางอ็อบเจ็กต์เดียว ไม่มีอะไรถูกทำเครื่องหมายเป็นเสริม วางอาร์เรย์ของอ็อบเจ็กต์เหมือนกันก็เช่นกัน แฟล็กทำงานเฉพาะเมื่อโครงสร้างภายในอาร์เรย์แตกต่างกัน
- แยกจำนวนเต็มกับทศนิยมอย่างไร?
- JSON มีชนิดตัวเลขเพียงชนิดเดียว เครื่องมือตรวจสอบแต่ละค่าและออก int เมื่อค่าไม่มีส่วนทศนิยม (`42`, `1000`) และออก float เมื่อมี (`3.14`, `99.0`) หากอาร์เรย์รวมทั้งสอง ชนิดจะถูกขยายเป็น float เพื่อเลี่ยงการถอดรหัสที่สูญเสีย
- ตรวจจับสตริงวันที่ ISO ได้ไหม?
- ได้ สตริงที่ตรงรูปแบบ `YYYY-MM-DD` หรือ `YYYY-MM-DDTHH:MM:SS[.sss][Z|±HH:MM]` ออกเป็นชนิดวันที่/เวลาเฉพาะภาษา (Date ใน TS, time.Time ใน Go, datetime ใน Python, DateTimeInterface ใน PHP, chrono::DateTime ใน Rust) รูปแบบวันที่อื่น ๆ จะคงเป็นสตริง
- ต้องติดตั้งอะไรเพื่อใช้โค้ดที่สร้างไหม?
- TypeScript: ไม่มี เอาต์พุตล้วน Go: เฉพาะไลบรารีมาตรฐาน (time.Time เมื่อมีวันที่ ISO) Python: โมดูล dataclasses มาตรฐาน PHP: ชนิด native Rust: ต้องการ serde + chrono หากมีวันที่ ISO หัวข้อ/import จะถูกเขียนลงเอาต์พุตเมื่อเกี่ยวข้อง
- สร้างชนิดข้อมูลสำหรับอาร์เรย์ของอ็อบเจ็กต์ที่รูทได้ไหม?
- ได้ หากค่ารูทเป็นอาร์เรย์ของอ็อบเจ็กต์ เครื่องมือจะออก struct สำหรับอีลีเมนต์และนามแฝงชนิดระดับบนสุดสำหรับอาร์เรย์ ตัวอย่าง: JSON `[{...}, {...}]` ที่ตั้งชื่อ `Users` ผลิต `User` interface พร้อม `type Users = User[];` ใน TypeScript หรือ `pub type Users = Vec<User>;` ใน Rust