logo
GeekFormat

JSON เป็น C++

เครื่องมือออนไลน์ฟรี JSON เป็น C++ วาง JSON เพื่อสร้างโค้ดไฟล์เฮดเดอร์ C++ struct/class ที่คอมไพล์ได้โดยอัตโนมัติ เหมาะสำหรับดีซีเรียลไลซ์การตอบสนอง API ด้วย nlohmann/json หรือ rapidjson อ็อบเจกต์ซ้อนในจะถูกแยกเป็นคลาสอิสระโดยอัตโนมัติ std::vector และ std::optional จะถูกจัดการโดยอัตโนมัติ ทำงานในเบราว์เซอร์ทั้งหมด

คำแนะนำที่เกี่ยวข้อง

เกี่ยวกับ JSON เป็น C++: การเปลี่ยนข้อมูล JSON เป็นสตรัคเจอร์ C++ ที่คอมไพล์ได้

JSON เป็น C++ คือกระบวนการแปลงข้อมูลในรูปแบบ JSON (อ็อบเจกต์หรืออาร์เรย์) เป็นนิยามประเภท struct/class C++ C++ เป็นภาษาโปรแกรมระบบประเภทเข้มงวดที่ใช้กันอย่างแพร่หลายในบริการแบ็กเอนด์ เอ็นจิ้นเกม เฟิร์มแวร์ระบบฝังตัว การค้าเชิงปริมาณ บริการประสิทธิภาพสูง และไคลเอ็นต์เดสก์ท็อป ในการพัฒนามักจำเป็นต้องแปลงตัวอย่าง JSON จากเอกสาร API หรือการตอบสนองจริงเป็นประเภท C++ การเขียนสตรัคเจอร์ด้วยตัวเองไม่เพียงแต่เป็นงานที่ซ้ำซาก แต่ยังมีแนวโน้มที่จะเขียนประเภทฟิลด์ผิด จุดประสงค์ของเครื่องมือนี้คือทำให้กระบวนการนี้เป็นอัตโนมัติ C++ แตกต่างจาก Java, Python, JavaScript ตรงที่ไม่มีการสนับสนุนเนทีฟสำหรับโครงสร้างไดนามิกเช่น JSON ดังนั้น 'JSON เป็น C++' จึงถูกมองว่าเป็นงานที่ 'ซ้ำซากแต่จำเป็นต้องทำ' ในวงการวิศวกรรมมานานแล้ว

เครื่องมือนี้ทำงานในเบราว์เซอร์ในเครื่องตาม quicktype-core โดยใช้เรนเดอร์ CPP และตัวเลือกการเรนเดอร์ just-types เพื่อสร้างโค้ดสตรัคเจอร์สำหรับ C++ ที่อ้างอิง std::string/std::vector<T>/std::optional<T> โค้ดที่สร้างขึ้นเป็นโค้ด C++ มาตรฐานแบบ header-only ที่ไม่ขึ้นอยู่กับไลบรารีแยกวิเคราะห์ JSON ของบุคคลที่สามใดๆ สามารถ #include เข้ากับโปรเจกต์ C++17/C++20 ใดๆ ได้โดยตรง เมื่อใช้ร่วมกับตัวแยกวิเคราะห์ nlohmann::json หรือ rapidjson สามารถดีซีเรียลไลซ์การตอบสนอง API ได้อย่างรวดเร็ว กระบวนการเรนเดอร์ทั้งหมดทำแบบอะซิงโครนัสในเบราว์เซอร์ผ่าน Web Worker เธรดหลักยังคงทำงานได้อย่างลื่นไหลและตอบสนองได้ดี

การอนุมานประเภทเป็นหัวใจของ JSON เป็น C++ เครื่องมือจะแมปประเภทพื้นฐานของ JSON เป็นประเภทมาตรฐานของ C++: สตริงเป็น std::string จำนวนเต็มเป็น int64_t (เข้ากันได้กับ long long หลีกเลี่ยงความแตกต่างขนาด long ข้ามแพลตฟอร์ม) จำนวนทศนิยมเป็น double บูลีนเป็น bool อาร์เรย์เป็น std::vector<T> อ็อบเจกต์ซ้อนในเป็นสตรัคเจอร์/คลาสอิสระ ค่า null เป็น std::optional<T> สำหรับอ็อบเจกต์ซ้อนใน เครื่องมือจะสร้างคลาสใหม่สำหรับแต่ละระดับโดยอัตโนมัติและตั้งชื่อตาม PascalCase ตัวอย่างเช่น ฟิลด์ address จะสร้างสตรัคเจอร์ Address อ็อบเจกต์ในอาร์เรย์ items จะสร้างสตรัคเจอร์ Item ระดับ JSON ที่ซ้อนกันเดียวกันจะถูกสร้างเพียงครั้งเดียวเท่านั้น ไม่มีการนิยามซ้ำ

แตกต่างจากเครื่องมือออนไลน์บางอย่างที่ต้องอัปโหลด JSON ไปยังเซิร์ฟเวอร์เพื่อประมวลผล การคำนวณทั้งหมดของเครื่องมือนี้ทำในเบราว์เซอร์ quicktype-core ถูกโหลดและดำเนินการผ่าน Web Worker การแยกวิเคราะห์ JSON การอนุมานประเภท การสร้างโค้ด C++ และการดาวน์โหลดไฟล์ทั้งหมดทำในเครื่อง ไม่มีการส่งข้อมูลไปยังเซิร์ฟเวอร์ใดๆ สิ่งนี้มีความสำคัญอย่างยิ่งสำหรับ JSON ที่มีคีย์ API ฟิลด์ความเป็นส่วนตัวของผู้ใช้ หรือโครงสร้างธุรกิจที่ยังไม่เปิดตัว ข้อมูลจะถูกลบออกจากหน่วยความจำหลังจากปิดหน้า ไม่ว่าสภาพแวดล้อมเครือข่ายของบริษัท ข้อกำหนดการตรวจสอบภายใน หรือสถานการณ์การพัฒนาออฟไลน์จะเป็นอย่างไร เครื่องมือนี้สามารถให้ความน่าเชื่อถือเทียบเท่ากับเครื่องมือบรรทัดคำสั่ง quicktype

โค้ดที่สร้างขึ้นมักต้องใช้ร่วมกับตัวแยกวิเคราะห์ JSON มีสองตัวเลือกหลัก: ① nlohmann::json (แนะนำ รวมเฮดเดอร์เดียว อินเทอร์เฟซซีเรียลไลซ์เทมเพลตใช้งานง่าย การเขียนคล้าย nlohmann::json j = nlohmann::json::parse(str); User u = j.get<User>();); ② rapidjson (การแยกวิเคราะห์สไตล์ SAX/DOM ประสิทธิภาพสูง เหมาะสำหรับสถานการณ์สุดขั้วเช่น การเงิน เกม ต้องการการแยกฟิลด์ด้วยตัวเองโดยใช้ GetObject) สำหรับระบบฝังตัวสามารถใช้ ArduinoJson (ทรัพยากรจำกัด) หรือ cJSON (อินเทอร์เฟซสไตล์ C) ได้ด้วย โค้ดของเครื่องมือนี้เข้ากันได้กับไลบรารี JSON C++ หลักทั้งหมด ไม่ได้ผูกมัดกับระบบนิเวศใดระบบนิเวศหนึ่งโดยเฉพาะ

ควรทราบว่าโค้ดที่สร้างโดยอัตโนมัติเป็นจุดเริ่มต้น ไม่ใช่จุดจบ เครื่องมืออนุมานประเภทตามตัวอย่าง JSON ไม่สามารถตัดสินประเภทที่ถูกต้องทางธุรกิจได้ (เช่น ประเภทเชิงความหมายเช่น URL อีเมล ID จะถูกอนุมานเป็น std::string อย่างสม่ำเสมอ) สำหรับฟิลด์ JSON snake_case ฟิลด์สตรัคเจอร์ C++ จะถูกสร้างโดยรักษารูปแบบเดิม คุณอาจต้องเพิ่ม NLOHMANN_DEFINE_TYPE_INTRUSIVE หรือ NLOHMANN_JSON_FROM/NLOHMANN_JSON_TO ด้วยตัวเองเพื่อประกาศความสัมพันธ์การแมป ขอแนะนำให้ถือผลลัพธ์ที่สร้างขึ้นเป็นร่างแรก จากนั้นปรับแต่งชื่อฟิลด์ ประเภท และคำอธิบายประกอบซีเรียลไลซ์ตามข้อกำหนดของโปรเจกต์ เวิร์กโฟลว์ 'AI เขียนร่างแรก + วิศวกรตรวจสอบ' นี้ยังเป็นจังหวะการทำงานจริงของทีม C++ จำนวนมาก

ในสถานการณ์การทำงานร่วมกันข้ามทีม JSON เป็น C++ ยังเป็นสะพานเชื่อมในการรวมโมเดลข้อมูล ฟรอนต์เอนด์ใช้ JSON เป็น TypeScript แบ็กเอนด์ใช้ JSON เป็น Java/Go/Rust ระบบฝังตัวและบริการประสิทธิภาพใช้ JSON เป็น C++ ทั้งสี่ฝ่ายสร้างนิยามประเภทของตนเองจากตัวอย่าง JSON เดียวกัน ซึ่งรับประกันความสอดคล้องของฟิลด์สูงสุด เครื่องมือนี้คือ 'ฝั่ง C++' ในเวิร์กโฟลว์นี้ สามารถใช้พร้อมกันกับเครื่องมืออื่นๆ บนเว็บไซต์สำหรับแปลง JSON เป็น TypeScript/Java/Rust/Go/Python

สรุปในประโยคเดียว: หากโค้ดของคุณทำงานในโปรเจกต์ C++ ที่ไวต่อประสิทธิภาพ ประเภทเข้มงวด และมีระบบนิเวศที่อุดมสมบูรณ์ และคุณต้องการเชื่อมต่อข้อมูลไดนามิกเช่น JSON เข้ากับโลกประเภทเข้มงวดอย่างรวดเร็ว เครื่องมือนี้คือจุดเริ่มต้นโดยตรงสำหรับการคอมไพล์ตัวอย่าง JSON เป็นสตรัคเจอร์ C++

กรณีการใช้งาน

  • การเชื่อมต่อ REST API: แปลงการตอบสนอง JSON ที่ส่งกลับจากแบ็กเอนด์เป็นสตรัคเจอร์ C++ ใช้ร่วมกับ nlohmann::json/cpr เพื่อดีซีเรียลไลซ์คำขอ HTTP แบบประเภทเข้มงวด
  • นิยามอินเทอร์เฟซไมโครเซอร์วิส: แปลงตัวอย่าง JSON ของเนื้อหาคำขอบริการ gRPC/HTTP เป็นประเภท C++ รวมนิยามโมเดลฝั่งเซิร์ฟเวอร์
  • ระบบฝังตัวและ IoT: แปลงข้อมูลเซ็นเซอร์ JSON ที่อุปกรณ์รายงานเป็นสตรัคเจอร์ C++ ใช้ร่วมกับ ArduinoJson หรือ ESP-IDF JSON Parser เพื่อแยกวิเคราะห์ข้อความ MQTT/HTTP
  • การพัฒนาเกม: แปลง JSON คอนฟิกเลเวล คุณสมบัติตัวละครเป็นสตรัคเจอร์ C++ ช่วยให้เอ็นจิ้นเช่น Unreal Engine หรือ Cocos2d-x อ่านไฟล์ข้อมูล .json ได้ง่ายขึ้น
  • การซื้อขายทางการเงินความถี่สูง: แปลงการตอบสนองอินเทอร์เฟซ JSON ของตลาดหลักทรัพย์ (เช่น ข้อมูลตลาด OKX/Binance/Xueqiu) เป็นสตรัคเจอร์ C++ ใช้ร่วมกับ rapidjson เพื่อแยกวิเคราะห์ระดับนาโนวินาที
  • ไคลเอ็นต์ C++ Qt: แปลงคอนฟิก JSON เซิร์ฟเวอร์เป็นสตรัคเจอร์ C++ ใช้ร่วมกับ QJsonObject/QJsonDocument เพื่อโหลดข้อมูล GUI
  • Boost.JSON/Boost.Beast: แปลงการตอบสนอง JSON ของบริการ HTTP เป็นสตรัคเจอร์ C++ ใช้ร่วมกับ Boost.JSON เพื่อดีซีเรียลไลซ์ เขียนแบ็กเอนด์เว็บ
  • RTOS สำหรับระบบฝังตัว: แปลง JSON คอนฟิกระบบ FreeRTOS/Zephyr เป็นสตรัคเจอร์ C++ ใช้ร่วมกับ cJSON เพื่ออ่านพารามิเตอร์เฟิร์มแวร์
  • อัลกอริทึม/การคิดเชิงปริมาณ: แปลง JSON คอนฟิกระบบแบ็กเทสต์เป็นสตรัคเจอร์ C++ ช่วยให้การจัดการคอนฟิกทดลอง A/B และการติดตามเวอร์ชันง่ายขึ้น
  • การย้ายฐานข้อมูล: แปลงเอกสาร JSON ที่ส่งออกจาก MongoDB/PostgreSQL เป็นโมเดล C++ ใช้เป็นข้อมูลอ้างอิงสำหรับฟิลด์เอนทิตี cpp-httplib/libpqxx
  • เสียง/วิดีโอ/มัลติมีเดีย: แปลง JSON คอนฟิก FFmpeg/GStreamer เป็นสตรัคเจอร์ C++ ช่วยให้การอ่านพารามิเตอร์ไปป์ไลน์สื่อง่ายขึ้น
  • การจำลองและการสร้างแบบจำลอง: แปลง JSON คอนฟิกอินพุตของระบบจำลองเป็นสตรัคเจอร์ C++ รวมรูปแบบข้อมูลอินพุตของโมเดลย่อยต่างๆ
  • การสร้างข้อมูลทดสอบ: แปลงฟิกซ์เจอร์ JSON จริงที่ส่งกลับจากแบ็กเอนด์เป็นประเภท C++ ทำการยืนยันเชิงโครงสร้างในการทดสอบหน่วย Google Test/Catch2
  • การแยกวิเคราะห์บันทึกเชิงโครงสร้าง: แปลงบันทึก JSON ที่ ELK/Loki จับได้เป็นประเภท C++ ช่วยให้การสร้างกฎการกรองและการแจ้งเตือนง่ายขึ้น
  • การย้ายศูนย์คอนฟิก: แปลง JSON คอนฟิก Apollo/Nacos/Consul เป็นประเภท C++ ใช้สำหรับการโหลดคอนฟิกร้อนฝั่งเซิร์ฟเวอร์
  • การทำงานร่วมกันข้ามภาษา: การเชื่อมต่อแบ็กเอนด์ C++ กับฟรอนต์เอนด์ TypeScript/Java JSON เดียวกันจะถูกแปลงเป็นสตรัคเจอร์ C++ และอินเทอร์เฟซ TS/POJO Java ตามลำดับเพื่อรักษาความสอดคล้องกันของทั้งสองฝั่ง
  • การเรียนการสอน: ในหลักสูตร C++ แปลงตัวอย่าง JSON เป็นสตรัคเจอร์ สาธิตกระบวนการดีซีเรียลไลซ์ nlohmann::json และแนวคิดเมตาโปรแกรมมิ่งเทมเพลต
  • การแปลงชื่อฟิลด์: หลังจากแปลงการตอบสนอง API JSON ในรูปแบบ snake_case เป็นสตรัคเจอร์ C++ แล้ว ให้เพิ่ม NLOHMANN_DEFINE_TYPE_INTRUSIVE ด้วยตัวเองเพื่อทำการแมปฟิลด์

วิธีการใช้งาน

  1. วางเนื้อหา JSON ในตัวแก้ไขทางด้านซ้าย (แนะนำให้เป็นอ็อบเจกต์ JSON) หรือคลิกปุ่มอัปโหลดเพื่อเลือกไฟล์ .json/.txt
  2. เครื่องมือใช้ quicktype-core ผ่าน Web Worker เพื่อแปลงโดยอัตโนมัติภายใน 400ms โค้ดไฟล์เฮดเดอร์ C++ ที่มี std::string/std::vector<T>/คลาสซ้อนในจะแสดงทางด้านขวา
  3. หากรูปแบบ JSON ไม่ถูกต้องจะมีข้อความสีแดงปรากฏขึ้น คลิกปุ่ม 'ซ่อมแซม JSON' เพื่อซ่อมแซมปัญหาทั่วไปเช่น จุลภาคท้าย คำพูดเดี่ยวโดยอัตโนมัติจากนั้นลองอีกครั้ง
  4. ตรวจสอบว่าชื่อสตรัคเจอร์/คลาสและประเภทฟิลด์ที่สร้างขึ้นเป็นไปตามที่คาดหวังหรือไม่ หากต้องการปรับเปลี่ยนให้แก้ไขชื่อคีย์ใน JSON ต้นทางแล้วแปลงใหม่
  5. คลิก 'คัดลอก' เพื่อวางโค้ดลงในไฟล์ .h/.hpp ใน IDE ใช้ร่วมกับ nlohmann::json หรือ rapidjson เพื่อดีซีเรียลไลซ์การตอบสนอง API จริง; หรือคลิก 'ดาวน์โหลด' เพื่อบันทึกเป็น model.h/model.hpp

คุณสมบัติ

  • การแปลงในเบราว์เซอร์ในเครื่อง: การแยกวิเคราะห์ JSON และการสร้างโค้ด C++ ทั้งหมดทำในเบราว์เซอร์ผ่าน Web Worker + quicktype-core ข้อมูลดิบจะไม่ถูกส่งไปยังเซิร์ฟเวอร์ใดๆ
  • เอาต์พุตสไตล์ nlohmann::json: สร้างสตรัคเจอร์ประเภท STL เช่น std::string/std::vector<T>/double/int64_t/bool โดยอัตโนมัติ สอดคล้องกับนิสัยดีซีเรียลไลซ์ nlohmann::json สามารถรวม <nlohmann/json.hpp> เพื่อแยกวิเคราะห์ได้โดยตรง
  • เข้ากันได้กับ rapidjson: สตรัคเจอร์ C++ บริสุทธิ์ที่สร้างขึ้นไม่ขึ้นอยู่กับไลบรารีของบุคคลที่สามใดๆ สามารถใช้กับ rapidjson Document/GenericValue ในสถานการณ์การแยกวิเคราะห์ประสิทธิภาพสูง
  • การอนุมานประเภทอัตโนมัติ: สตริง JSON แมปเป็น std::string จำนวนเต็มเป็น int64_t/long long จำนวนทศนิยมเป็น double บูลีนเป็น bool อาร์เรย์เป็น std::vector<T> อ็อบเจกต์ซ้อนในเป็นคลาส/สตรัคเจอร์อิสระ
  • การแยกอ็อบเจกต์ซ้อนในอัตโนมัติ: JSON ที่ซ้อนกันจะสร้างคลาส/สตรัคเจอร์อิสระโดยอัตโนมัติ (การตั้งชื่อ PascalCase) หลีกเลี่ยงการนิยามประเภทเดียวกันซ้ำๆ
  • การจัดการ std::vector และ std::optional อัตโนมัติ: อาร์เรย์ JSON จะถูกแปลงเป็น std::vector<T> ฟิลด์ที่อาจเป็น null จะถูกรองรับเป็น std::optional<T> สอดคล้องกับแนวทางปฏิบัติ C++17/C++20 สมัยใหม่
  • การแปลงอัตโนมัติด้วยดีบาวน์ 400ms: หลังจากวาง JSON การแปลงจะถูกทริกเกอร์โดยอัตโนมัติ โค้ดเฮดเดอร์ C++ จะถูกแสดงตัวอย่างทางด้านขวาแบบเรียลไทม์ ลดการรอคอยและการคลิกที่ไม่จำเป็น
  • ซ่อมแซมข้อผิดพลาด JSON ในคลิกเดียว: ซ่อมแซมข้อผิดพลาดรูปแบบทั่วไปโดยอัตโนมัติ เช่น จุลภาคท้าย คำพูดเดี่ยว คำพูดที่ขาดหายไป หลังจากซ่อมแซมสำเร็จจะดำเนินการสร้างโค้ดต่อไป
  • ไฮไลต์ไวยากรณ์ + คัดลอกในคลิกเดียว: พื้นที่ CodeMirror ทางด้านขวาแสดงไฮไลต์ไวยากรณ์ C++ คัดลอกไฟล์เฮดเดอร์ทั้งหมดในคลิกเดียวหรือดาวน์โหลดเป็นไฟล์ .h/.hpp เพื่อใส่ในโปรเจกต์โดยตรง
  • ประวัติการป้อนค่า localStorage + คอลัมน์ที่ตอบสนองได้: บันทึกการป้อนล่าสุดโดยอัตโนมัติ สามารถกู้คืนได้อย่างรวดเร็วหลังจากรีเฟรชหรือปิดหน้าโดยไม่ได้ตั้งใจ วาง JSON ทางซ้าย ดูโค้ด C++ ทางขวา รองรับการลากเพื่อปรับความกว้างแผง ปรับให้เข้ากับหน้าจอขนาดใหญ่และอุปกรณ์เคลื่อนที่
  • ผลิตภัณฑ์ header-only ไร้การอ้างอิง: .h/.hpp ที่สร้างขึ้นอยู่ในรูปแบบ header-only สามารถรวมในไฟล์เดียวเข้ากับโปรเจกต์ C++ มาตรฐานใดๆ สามารถใช้กับ nlohmann::json/rapidjson/Boost.JSON ได้โดยไม่ต้องตั้งค่าการสร้างเพิ่มเติม
  • การแปลง snake_case เป็น camelCase ในตัว: สามารถแปลงฟิลด์ snake_case ใน JSON เป็นชื่อฟิลด์ camelCase ที่แนะนำสำหรับ C++ โดยอัตโนมัติ ทำงานร่วมกับ NLOHMANN_DEFINE_TYPE_INTRUSIVE เพื่อรักษาการแมปซีเรียลไลซ์ snake_case

ตัวอย่างโค้ด

C++: ดีซีเรียลไลซ์สตรัคเจอร์ที่สร้างโดยเครื่องมือนี้ด้วย nlohmann/json

cpp

วางสตรัคเจอร์ User ที่สร้างขึ้นใน .hpp ใช้ดีซีเรียลไลซ์ด้วย nlohmann::json (แนะนำสำหรับโปรเจกต์ C++17/20 สมัยใหม่)

// model.hpp (สร้างโดยเครื่องมือนี้)
// #pragma once
// #include <cstdint>
// #include <optional>
// #include <string>
// #include <vector>
// struct Address {
//   std::string city;
//   std::string zip;
// };
// struct User {
//   int64_t id;
//   std::string name;
//   std::optional<Address> address;
//   std::vector<std::string> tags;
// };

#include <nlohmann/json.hpp>
#include "model.hpp"

using nlohmann::json;

int main() {
    std::string raw = R"({
        "id": 1,
        "name": "Alice",
        "address": { "city": "Beijing", "zip": "100000" },
        "tags": ["cpp", "nlohmann"]
    })";

    // 1) แยกวิเคราะห์สตริง JSON
    json j = json::parse(raw);

    // 2) ดีซีเรียลไลซ์ประเภทเข้มงวดไปยังสตรัคเจอร์ที่สร้างโดยเครื่องมือนี้
    User u = j.get<User>();

    // 3) เข้าถึงฟิลด์
    std::cout << u.name << " lives in "
              << (u.address ? u.address->city : "unknown")
              << std::endl;

    for (const auto& tag : u.tags) {
        std::cout << "tag: " << tag << std::endl;
    }
    return 0;
}

/*
 * การคอมไพล์ (โปรเจกต์ CMake):
 *   find_package(nlohmann_json REQUIRED)
 *   target_link_libraries(my_app PRIVATE nlohmann_json::nlohmann_json)
 * การคอมไพล์ (vcpkg):
 *   vcpkg install nlohmann-json
 * การรวมไฟล์เดียว:
 *   ดาวน์โหลด json.hpp โดยตรงจากรีลีส https://github.com/nlohmann/json/releases
 */

C++: แยกวิเคราะห์ JSON ไปยังสตรัคเจอร์ที่สร้างโดยเครื่องมือนี้ด้วย rapidjson

cpp

rapidjson ไม่สนับสนุนการดีซีเรียลไลซ์อัตโนมัติไปยังสตรัคเจอร์ที่กำหนดเอง จำเป็นต้องแยกฟิลด์ด้วยตัวเองโดยใช้ GetObject เหมาะสำหรับสถานการณ์ประสิทธิภาพสูงเช่น การเงิน/เกม

#include "rapidjson/document.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
#include "model.hpp"

int main() {
    const char* raw = R"({
        "id": 1,
        "name": "Alice",
        "address": { "city": "Beijing", "zip": "100000" },
        "tags": ["cpp", "rapidjson"]
    })";

    // 1) การแยกวิเคราะห์ DOM rapidjson
    rapidjson::Document doc;
    doc.Parse(raw);

    // 2) สร้างสตรัคเจอร์ที่สร้างโดยเครื่องมือนี้และเติมข้อมูลด้วยตัวเอง
    User u;
    u.id = doc["id"].GetInt64();
    u.name = doc["name"].GetString();

    if (doc.HasMember("address") && doc["address"].IsObject()) {
        Address addr;
        addr.city = doc["address"]["city"].GetString();
        addr.zip  = doc["address"]["zip"].GetString();
        u.address = addr;
    }

    for (auto& tag : doc["tags"].GetArray()) {
        u.tags.push_back(tag.GetString());
    }

    // 3) ใช้สตรัคเจอร์ที่เติมข้อมูลแล้ว
    std::cout << u.name << ", tags=" << u.tags.size() << std::endl;
    return 0;
}

/*
 * เคล็ดลับประสิทธิภาพสูง rapidjson:
 *   ① การใช้ร่วมกับ rapidjson::MemoryPoolAllocator และ StringBuffer สามารถเร่งความเร็วเพิ่มเติมได้;
 *   ② ในสถานการณ์ความถี่สูงสามารถใช้ Reader/Writer สไตล์ SAX เพื่อประมวลผลแบบสตรีมมิ่งโดยตรง;
 *   ③ การเปิดใช้งานมาโคร RAPIDJSON_SSE42/RAPIDJSON_SIMD ช่วยให้สามารถใช้คำสั่ง SIMD ของ CPU เพื่อเร่งความเร็วได้
 */

C++: จัดการการแมปฟิลด์ snake_case ด้วย NLOHMANN_DEFINE_TYPE_INTRUSIVE

cpp

เมื่อฟิลด์ JSON อยู่ในรูปแบบ snake_case และคุณต้องการให้สมาชิก C++ ใช้ camelCase/PascalCase ให้ประกาศการแมปด้วยมาโคร nlohmann/json

#include <nlohmann/json.hpp>
#include <string>
#include <cstdint>

// สมมติว่าเครื่องมือสร้างฟิลด์ snake_case: user_name, created_at
// เมื่อเปลี่ยนชื่อเป็น camelCase ในโปรเจกต์จริงให้เพิ่มมาโครต่อไปนี้
struct UserProfile {
    int64_t id;
    std::string userName;       // ใน JSON คือ "user_name"
    std::string emailAddress;   // ใน JSON คือ "email_address"
    std::string createdAt;      // ใน JSON คือ "created_at"
};

// ใช้ NLOHMANN_DEFINE_TYPE_INTRUSIVE เพื่อประกาศการแมปภายในคลาส
// หมายเหตุ: ต้องวางไว้ในพื้นที่ public
// 
// NLOHMANN_DEFINE_TYPE_INTRUSIVE(UserProfile, id, userName, emailAddress, createdAt)

// หรือใช้มาโครที่ไม่รุกล้ำ (หลีกเลี่ยงการแก้ไขคลาสเอง):
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(UserProfile, id, userName, emailAddress, createdAt)

// วิธีใช้งาน:
int main() {
    nlohmann::json j = {
        {"id", 1},
        {"user_name", "Alice"},
        {"email_address", "a****@***********"},
        {"created_at", "2026-07-14T10:00:00.000Z"}
    };

    UserProfile p = j.get<UserProfile>();
    // เมื่อซีเรียลไลซ์จะส่งออกด้วยชื่อฟิลด์เดิมเช่นกัน
    std::cout << j.dump(2) << std::endl;
    return 0;
}

/*
 * เคล็ดลับ:
 *   ① มาโครรุกล้ำ (NLOHMANN_DEFINE_TYPE_INTRUSIVE) ต้องวางไว้ในพื้นที่ public;
 *   ② มาโครที่ไม่รุกล้ำ (NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE) ถูกกำหนดไว้นอกคลาส;
 *   ③ ลำดับฟิลด์ต้องสอดคล้องกับพารามิเตอร์ของมาโครอย่างเคร่งครัด;
 *   ④ ฟิลด์วันที่สามารถประมวลผลด้วย adl_serializer ที่กำหนดเองของ nlohmann::json ในรูปแบบ ISO 8601
 */

Best Practices

ทีมส่วนใหญ่แนะนำให้ใช้ nlohmann::json ก่อน เนื่องจาก API มีลักษณะคล้าย STL เมื่อดีซีเรียลไลซ์ j.get<User>() เพียงบรรทัดเดียวก็เพียงพอ ความสามารถในการอ่านสูงมาก เปลี่ยนไปใช้ rapidjson เฉพาะเมื่อคุณพบปัญหาคอขวดของประสิทธิภาพ (เช่น การแยกฟิลด์ JSON หลายล้านฟิลด์ต่อวินาที) สตรัคเจอร์ที่สร้างโดยเครื่องมือนี้สามารถทำงานร่วมกับทั้งสองได้

ที่เก็บ nlohmann/jsonที่เก็บ rapidjson

การใช้ include(FetchContent) + FetchContent_Declare(nlohmann_json URL ...) เป็นวิธีที่สะอาดที่สุดในการรวม nlohmann/json ใน CMaker ไม่จำเป็นต้องติดตั้ง vcpkg ล่วงหน้า; หากไม่ต้องการตั้งค่า FetchContent สามารถใช้ vcpkg install nlohmann-json หรือดาวน์โหลดไฟล์ json.hpp เดี่ยวโดยตรงแล้วรวมเข้าไป

เอกสารอย่างเป็นทางการ CMake FetchContent

เครื่องมือจะรักษาชื่อฟิลด์เดิมของ JSON (snake_case) ตามค่าเริ่มต้น หากคุณต้องการให้สมาชิก C++ เป็น camelCase หรือ PascalCase คุณต้องเพิ่ม NLOHMANN_DEFINE_TYPE_INTRUSIVE(UserProfile, id, userName, ...) ภายในคลาสเพื่อแมปคีย์ JSON กับสมาชิก C++ อย่างชัดเจน มิฉะนั้นดีซีเรียลไลซ์จะล้มเหลว

เอกสาร NLOHMANN_DEFINE_TYPE_INTRUSIVE

C++17+ ใช้ std::optional<T> โดยตรง; โปรเจกต์ C++11/14 แทนที่ด้วย boost::optional<T> (#include <boost/optional.hpp>); โปรเจกต์สไตล์ C ใช้ cJSON + ฟิลด์เซนติเนล (-1, สตริงว่าง) เพื่อแสดงค่า null ควรทราบว่าอินเทอร์เฟซของ std::optional และ boost::optional แตกต่างกันเล็กน้อย (has_value() vs is_initialized())

cppreference std::optional

บนอุปกรณ์ที่มี RAM น้อยมากเช่น Arduino Uno/ESP8266 std::vector และ std::string มักจะทำให้เกิด OOM แทนที่จะนั้นให้ใช้ ArduinoJson 6.x + StaticJsonDocument<ความจุ> เพื่อจำกัดบัฟเฟอร์ แทนที่ std::vector<T> ด้วย std::array<T, N> ขนาดคงที่ และ std::string ด้วย const char* + ความยาว

เอกสาร ArduinoJson

การแยกวิเคราะห์ การสร้างโค้ดและการดาวน์โหลดไฟล์ทั้งหมดของเครื่องมือนี้ทำในเบราว์เซอร์ในเครื่องผ่าน Web Worker JSON ดั้งเดิมจะไม่ถูกส่งไปยังเซิร์ฟเวอร์ใดๆ แต่ยังแนะนำให้: ① ทำให้โมเดลธุรกิจภายในไม่ละเอียดอ่อนก่อน (ลบโทเค็น/หมายเลขโทรศัพท์ ฯลฯ); ② การปิดหน้าจะล้างหน่วยความจำ; ③ ในสถานการณ์การปฏิบัติตามกฎระเบียบของบริษัทขนาดใหญ่ แนะนำให้ประมวลผล JSON ที่มีข้อมูลลูกค้าด้วยบรรทัดคำสั่ง quicktype ในเครื่องใน IDE

JSON ที่มีการซ้อนในมากกว่า 6 ระดับแนะนำให้ปรับโครงสร้างใหม่ที่ฝั่งต้นทาง หรือแบ่งโครงสร้างที่ซ้อนในลึกเป็นสตรัคเจอร์ระหว่างกลางด้วยตัวเองหลังจากสร้างโดยเครื่องมือนี้เพื่อปรับปรุงความสามารถในการอ่านและความเร็วในการคอมไพล์ การซ้อนในลึกจะทำให้ความลึกของการอินสแตนซ์เทมเพลตลึกเกินไป คอมไพเลอร์เก่าบางตัว (ต่ำกว่า GCC 6) จะให้ข้อผิดพลาด 'เกินความลึกของการอินสแตนซ์เทมเพลต'

โค้ดที่สร้างโดยเครื่องมือนี้โดยพื้นฐานแล้วคือ C++ (ใช้คุณสมบัติ C++ เช่น std::optional/เทมเพลต) แนะนำให้ใช้นามสกุล .hpp ซึ่งหมายถึง 'เฮดเดอร์ C++' เพื่อแยกจาก .h เฮดเดอร์ C ในโปรเจกต์ CMake: set_target_properties(target PROPERTIES CXX_EXTENSIONS ON); CMake ยังสามารถจดจำโดยอัตโนมัติว่าควรคอมไพล์ด้วย gcc หรือ g++ ตาม .h vs .hpp ซึ่งช่วยลดปัญหาที่เทมเพลต header-only ไม่ได้รับการอินสแตนซ์ใหม่ให้มากที่สุด

ข้อมูลจำเพาะนามสกุลไฟล์ GCCการจดจำประเภทไฟล์ CMake

คำถามที่พบบ่อย

จะแปลง JSON เป็นสตรัคเจอร์/นิยามคลาส C++ ได้อย่างไร

วางเนื้อหา JSON ในตัวแก้ไขทางด้านซ้าย (รองรับการลากและวางหรือคลิกเพื่ออัปโหลดไฟล์ .json/.txt ด้วย) เครื่องมือจะเรียก quicktype-core ในเบราว์เซอร์โดยอัตโนมัติภายใน 400ms เพื่อสร้างโค้ดไฟล์เฮดเดอร์ C++; พื้นที่ CodeMirror ทางด้านขวาจะแสดงโค้ดสตรัคเจอร์ที่มี std::string/std::vector<T>/คลาสซ้อนใน หากรูปแบบ JSON ไม่ถูกต้อง ให้คลิกปุ่ม 'ซ่อมแซม JSON' เพื่อซ่อมแซมโดยอัตโนมัติจากนั้นแปลงใหม่

โค้ด C++ ที่สร้างขึ้นต้องรวมไฟล์เฮดเดอร์อะไรบ้าง

เครื่องมือสร้างโค้ดสตรัคเจอร์ header-only ที่ขึ้นอยู่กับไลบรารีมาตรฐาน C++ เท่านั้น (<string>, <vector>, <optional>, <cstdint>) เมื่อแยกวิเคราะห์ด้วย nlohmann/json ต้องมี #include <nlohmann/json.hpp> เพิ่มเติม; เมื่อแยกวิเคราะห์ด้วย rapidjson ต้องมี #include "rapidjson/document.h" ไฟล์เฮดเดอร์มาตรฐานอื่นๆ จะถูกประกาศโดยเครื่องมือเมื่อจำเป็น

รองรับโครงสร้างข้อมูล JSON อะไรบ้าง

รองรับโครงสร้าง JSON ที่ถูกกฎหมายทั้งหมด: ประเภทพื้นฐาน (null, boolean, number, string), อาร์เรย์ (หนึ่งมิติหรือหลายมิติ), อ็อบเจกต์ซ้อนใน (ความลึกใดๆ) อ็อบเจกต์ JSON จะสร้างสตรัคเจอร์/คลาสราก อาร์เรย์ JSON จะปรากฏเป็น std::vector<T> ในฟิลด์ของสตรัคเจอร์บน ไม่รองรับลิเทอรัลอ็อบเจกต์ JavaScript ฟังก์ชัน Symbol undefined และค่าที่ไม่ใช่ JSON อื่นๆ

ประเภทฟิลด์ JSON แมปไปยังประเภท C++ อย่างไร

สตริงแมปเป็น std::string; จำนวนเต็มเป็น int64_t (มักใช้ long long เพื่อความเข้ากันได้กับโค้ดเก่า); จำนวนทศนิยมเป็น double; บูลีนเป็น bool; อาร์เรย์เป็น std::vector<T>; อ็อบเจกต์ซ้อนในเป็นสตรัคเจอร์/คลาสอิสระ; ค่า null เป็น std::optional<T> (อาจรองรับด้วย nlohmann::json) สำหรับกฎการแมปโดยละเอียด ดูที่ 'ตารางอ้างอิงการแมปประเภท JSON เป็นประเภท C++' ที่ด้านล่างของหน้า

ค่า null จะสร้างประเภทอะไร

ค่า null ใน JSON จะสร้าง std::optional<T> (ใช้ได้ตั้งแต่ C++17) ซึ่งระบุว่าฟิลด์อาจขาดหายไปหรือมีประเภทที่ไม่แน่นอน หากคุณทราบประเภทที่แท้จริงของฟิลด์แล้ว คุณสามารถให้ค่าตัวอย่างใน JSON ต้นทาง (เช่น "field": "" จะอนุมานเป็น std::string) แล้วเปลี่ยนเป็นประเภทที่แม่นยำยิ่งขึ้นเช่น std::optional<std::string> หลังจากสร้างตามความต้องการทางธุรกิจ

อาร์เรย์จะถูกแปลงเป็น std::vector โดยอัตโนมัติหรือไม่

ใช่ อาร์เรย์ JSON จะถูกแปลงเป็นคอนเทนเนอร์เทมเพลต C++ std::vector<T> อย่างสม่ำเสมอ ประเภทองค์ประกอบจะถูกอนุมานโดยอัตโนมัติตามองค์ประกอบแรกของอาร์เรย์ ตัวอย่างเช่น ["a","b"] สร้าง std::vector<std::string>, [1,2,3] สร้าง std::vector<int64_t>, [{...},{...}] สร้าง std::vector<Item> (โดยที่ Item เป็นสตรัคเจอร์อิสระที่สร้างจากอ็อบเจกต์ซ้อนใน)

อ็อบเจกต์ซ้อนในจะถูกจัดการอย่างไร

อ็อบเจกต์ซ้อนในแต่ละตัวจะสร้างสตรัคเจอร์/คลาสอิสระ กฎการตั้งชื่อคือ PascalCase จากชื่อฟิลด์ (เช่น ฟิลด์ address สร้างสตรัคเจอร์ Address อ็อบเจกต์ในอาร์เรย์ items สร้างสตรัคเจอร์ Item) ในสตรัคเจอร์ราก อ็อบเจกต์ที่ซ้อนกันจะถูกอ้างอิงโดยสมาชิกประเภท std::optional<Address> หรือ Address อ็อบเจกต์ที่มีโครงสร้างเดียวกันจะใช้ประเภทเดิมซ้ำ หลีกเลี่ยงการนิยามซ้ำ

โค้ดที่สร้างขึ้นสามารถใช้กับ nlohmann/json เพื่อดีซีเรียลไลซ์ได้หรือไม่

ได้ ตัวอย่างการใช้งานทั่วไป: nlohmann::json j; j["root"] = nlohmann::json::parse(raw_json); User u = j.get<User>(); เงื่อนไขคือโปรเจกต์ได้เพิ่มการอ้างอิงเฮดเดอร์เดี่ยว nlohmann/json (รวม <nlohmann/json.hpp> โดยตรง) และได้นิยามสตรัคเจอร์ User ที่สร้างโดยเครื่องมือนี้แล้ว

โค้ดที่สร้างขึ้นสามารถใช้กับ rapidjson เพื่อดีซีเรียลไลซ์ได้หรือไม่

ได้ rapidjson ต้องการให้คุณเขียนโค้ดแยกฟิลด์ประเภท GetObject ด้วยตัวเอง เส้นทางทั่วไป: rapidjson::Document doc; doc.Parse(raw_json); const auto& obj = doc["root"]; std::string id = obj["id"].GetString(); เนื่องจาก rapidjson ไม่สนับสนุนการดีซีเรียลไลซ์อัตโนมัติผ่านเทมเพลต สตรัคเจอร์ที่สร้างขึ้นจึงทำหน้าที่เป็นเพียงการอ้างอิงโมเดลข้อมูลเท่านั้น

ฟิลด์ JSON snake_case จะถูกจัดการอย่างไร

เครื่องมือจะสร้างฟิลด์ C++ โดยรักษาชื่อฟิลด์เดิมของ JSON (เช่น user_name) หากคุณต้องการให้สมาชิก C++ ใช้ camelCase (userName) หรือ PascalCase (UserName) คุณสามารถแก้ไขด้วยตัวเองหลังจากสร้างแล้วเพิ่มมาโคร JSNOMacros (NLOHMANN_DEFINE_TYPE_INTRUSIVE/NLOHMANN_JSON_FROM/NLOHMANN_JSON_TO) เพื่อระบุการแมป

ไฟล์เฮดเดอร์ที่สร้างขึ้นสามารถใส่ในโปรเจกต์ Qt/Unreal/Boost โดยตรงได้หรือไม่

ได้ โค้ดที่สร้างโดยเครื่องมือนี้เป็นโค้ด C++ มาตรฐานแบบ header-only ที่ไม่ขึ้นอยู่กับเฟรมเวิร์กเฉพาะ เมื่อแยกวิเคราะห์ด้วย Qt QJsonObject ให้ใช้สตรัคเจอร์เป็นโมเดลข้อมูล (สมาชิกทำเครื่องหมายด้วย Q_GADGET); เมื่อใช้กับ Unreal Engine ให้ใช้ร่วมกับ FJsonObjectConverter::JsonObjectStringToUStruct; เมื่อใช้กับ Boost.JSON ให้แยกวิเคราะห์ JSON เป็น boost::json::object จากนั้นแยกฟิลด์ทีละฟิลด์

ข้อมูลจะถูกอัปโหลดไปยังเซิร์ฟเวอร์หรือไม่ ปลอดภัยในเรื่องความเป็นส่วนตัวหรือไม่

ทำงานในเบราว์เซอร์ทั้งหมด การแยกวิเคราะห์ JSON การสร้างโค้ด C++ และการดาวน์โหลดไฟล์ทั้งหมดทำในเบราว์เซอร์ผ่าน JavaScript (Web Worker + quicktype-core) ข้อมูล JSON ที่ป้อนและโค้ด C++ ที่สร้างขึ้นจะไม่ถูกส่งไปยังเซิร์ฟเวอร์ใดๆ และจะไม่ถูกบันทึกหรือแคชในคลาวด์ JSON ที่ละเอียดอ่อนซึ่งมีคีย์ API โทเค็น ฟิลด์ธุรกิจที่ไม่เปิดเผยสามารถใช้งานได้อย่างปลอดภัย ข้อมูลจะถูกลบเมื่อปิดหน้า

ต้องลงทะเบียนหรือเข้าสู่ระบบหรือไม่

ไม่ต้อง เครื่องมือฟรีทั้งหมด ไม่ต้องลงทะเบียน เข้าสู่ระบบ หรือให้สิทธิ์ เปิดหน้าและใช้งานได้เลย ฟังก์ชันทั้งหมดสามารถใช้ได้ในเบราว์เซอร์โดยไม่มีข้อจำกัดจำนวนครั้งการเรียกใช้หรือขนาดไฟล์ (จำกัดโดยหน่วยความจำเบราว์เซอร์)

จะทำอย่างไรหากมีข้อผิดพลาดรูปแบบ JSON

เครื่องมือจะตรวจสอบความถูกต้องของ JSON โดยอัตโนมัติ หากมีข้อผิดพลาดจะแสดงข้อความผิดพลาดสีแดงทางด้านขวาและมีปุ่ม 'ซ่อมแซม JSON' หลังจากคลิกสามารถซ่อมแซมข้อผิดพลาดทั่วไปโดยอัตโนมัติ: จุลภาคเพิ่มเติมที่ท้าย การแทนที่คำพูดเดี่ยวด้วยคำพูดคู่ การเติมคำพูดสำหรับคีย์ที่ไม่มีคำพูด การลบความคิดเห็น ฯลฯ หลังจากซ่อมแซมสำเร็จจะดำเนินการสร้างโค้ด C++ ต่อไป

เครื่องมือนี้แตกต่างจาก JSON เป็น Java / JSON เป็น Rust อย่างไร

ทั้งสามอย่างแปลง JSON เป็นนิยามประเภทในภาษาเป้าหมาย แต่รูปแบบผลลัพธ์แตกต่างกัน: JSON เป็น C++ สร้างสตรัคเจอร์/คลาส header-only ต้องการให้คุณเขียนโค้ดดีซีเรียลไลซ์เพิ่มเติมด้วย nlohmann/json หรือ rapidjson; JSON เป็น Java สร้างคลาส POJO เต็มรูปแบบพร้อม getter/setter สามารถคอมไพล์และรันได้โดยตรง; JSON เป็น Rust สร้างสตรัคเจอร์ที่มี Serde derive สามารถดีซีเรียลไลซ์ด้วย serde_json โดยตรง การเลือกขึ้นอยู่กับสแตกเทคโนโลยีของคุณ

การแก้ไขปัญหา

ข้อความ 'กรุณาป้อนข้อมูล JSON' หรือด้านขวาว่างเปล่า

ช่องป้อนข้อมูลทางด้านซ้ายว่างเปล่าหรือมีเฉพาะช่องว่างเท่านั้น ตรวจสอบให้แน่ใจว่าคุณวางเนื้อหา JSON ที่ถูกต้องแล้ว หรือคลิกปุ่มอัปโหลดเพื่อเลือกไฟล์ .json/.txt คุณยังสามารถคลิกปุ่มตัวอย่างเพื่อโหลดตัวอย่างในตัว (มีฟิลด์ address/tags ที่ซ้อนกัน)

ข้อความการแยกวิเคราะห์ JSON ล้มเหลว

สาเหตุทั่วไป: มีจุลภาคเพิ่มเติมที่ท้าย ใช้คำพูดเดี่ยวแทนคำพูดคู่ คีย์ไม่มีคำพูด มีความคิดเห็น JavaScript คลิกปุ่ม 'ซ่อมแซม JSON' เพื่อซ่อมแซมข้อผิดพลาดบางอย่างโดยอัตโนมัติ; หากยังไม่สำเร็จ ให้ตรวจสอบด้วยเครื่องมือจัดรูปแบบ JSON ก่อน

ข้อผิดพลาดการคอมไพล์ 'std::optional ไม่ได้ประกาศ'

โปรเจกต์ไม่ได้ใช้มาตรฐาน C++17 ขึ้นไป std::optional ถูกนำมาใช้ใน C++17 ใน CMakeLists.txt ให้ตั้งค่า CMAKE_CXX_STANDARD เป็น 17 หรือสูงกว่า (หรือใช้ set(CMAKE_CXX_STANDARD 17)); หรือเพิ่ม #include <optional> ที่ด้านบนของไฟล์ซอร์สและยืนยันเวอร์ชันคอมไพเลอร์

ข้อผิดพลาดการคอมไพล์ 'int64_t ไม่ได้ประกาศ'

เครื่องมือใช้ int64_t จาก <cstdint> ต้องการ GCC 4.5+/Clang 3.0+/MSVC 2015+ ตรวจสอบว่ามี #include <cstdint> หรือ #include <stdint.h> ที่ด้านบนของไฟล์ซอร์สหรือไม่ และยืนยันว่าการตั้งค่ามาตรฐาน C++ ของ CMake มีค่า >= C++11

ฟิลด์สูญหายระหว่างดีซีเรียลไลซ์ nlohmann::json

สาเหตุที่เป็นไปได้: ① ชื่อฟิลด์ JSON ไม่ตรงกับชื่อสมาชิก C++ อย่างสมบูรณ์ (snake_case vs camelCase); ② อ็อบเจกต์ที่ซ้อนกันไม่ได้รับการจัดการอย่างถูกต้อง; ③ การเข้าถึง value() ของฟิลด์ std::optional โยนข้อยกเว้น วิธีแก้ไข: เพิ่มมาโคร NLOHMANN_DEFINE_TYPE_INTRUSIVE เพื่อแมปฟิลด์อย่างชัดเจน หรือใช้ j.value("key", default) เพื่อให้ค่าเริ่มต้น

ข้อผิดพลาดเซกเมนต์ GetString ระหว่างการแยกวิเคราะห์ rapidjson

rapidjson จะไม่ตรวจสอบประเภทฟิลด์ตามค่าเริ่มต้น GetString จะปลอดภัยก็ต่อเมื่อฟิลด์มีอยู่จริงและเป็นประเภทสตริง การเขียนที่ปรับปรุงแล้ว: if (doc.HasMember("name") && doc["name"].IsString()) { u.name = doc["name"].GetString(); } หลีกเลี่ยงการใช้ GetInt/GetString โดยตรงบนคีย์ที่ไม่มีอยู่

ประเภทฟิลด์ที่สร้างขึ้นไม่แม่นยำพอ (จำนวนเต็มทั้งหมดเป็น int64_t)

เครื่องมืออนุมานประเภทตามตัวอย่าง JSON จำนวนเต็มทั้งหมดเป็น int64_t สตริงทั้งหมดเป็น std::string หากคุณต้องการประเภทที่แม่นยำยิ่งขึ้นเช่น int32_t, uint64_t, std::chrono::system_clock::time_point ให้เปลี่ยนประเภทฟิลด์ด้วยตัวเองหลังจากสร้างแล้วและตรวจสอบให้แน่ใจว่าไลบรารีแยกวิเคราะห์ JSON ที่เลือกรองรับการดีซีเรียลไลซ์ประเภทนั้น

ฟิลด์ null สร้าง std::optional<nlohmann::json> แทน std::optional<std::string>

เนื่องจาก JSON null ไม่สามารถอนุมานประเภทเฉพาะได้ เครื่องมือจะรองรับอย่างปลอดภัยเป็น std::optional<nlohmann::json> หากคุณทราบประเภทที่แท้จริงของฟิลด์ คุณสามารถให้ค่าตัวอย่างใน JSON ต้นทาง (เช่น "field": "" จะอนุมานเป็น std::string) สร้างใหม่จากนั้นเปลี่ยนเป็น std::optional<std::string> ด้วยตัวเอง

ฟิลด์ JSON snake_case ไม่สอดคล้องกับสไตล์การตั้งชื่อ C++

เครื่องมือจะสร้างฟิลด์ C++ โดยรักษาชื่อฟิลด์เดิมของ JSON (เช่น user_name) หากคุณต้องการให้สมาชิก C++ ใช้ camelCase (userName) และดีซีเรียลไลซ์ JSON snake_case ได้อย่างถูกต้องในเวลาเดียวกัน โปรดดูย่อหน้าที่ 3 ของ codeExamples โดยใช้มาโคร NLOHMANN_DEFINE_TYPE_INTRUSIVE/NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE

ไฟล์ .hpp ที่ดาวน์โหลดมามีข้อผิดพลาดการคอมไพล์ในโปรเจกต์

สาเหตุที่เป็นไปได้: ① CMake ไม่ได้ตั้งค่ามาตรฐาน C++17/C++20; ② ขาดไฟล์เฮดเดอร์เช่น <optional>/<vector>; ③ ชื่อสตรัคเจอร์ขัดแย้งกับประเภทอื่นในโปรเจกต์ วิธีแก้ไข: เพิ่ม set(CMAKE_CXX_STANDARD 17) ใน CMakeLists.txt เพิ่มไฟล์เฮดเดอร์ที่เหมาะสมที่ด้านบนของไฟล์ซอร์ส ห่อด้วย namespace หรือเปลี่ยนชื่อสตรัคเจอร์ที่ขัดแย้ง

อภิธานศัพท์

struct / class
คีย์เวิร์ดใน C++ ที่ใช้กำหนดประเภทข้อมูลผสม เครื่องมือนี้สร้าง struct เช่น struct User { int64_t id; std::string name; } ใน C++ struct และ class เกือบจะเทียบเท่ากัน (ความแตกต่างที่สิทธิ์การเข้าถึงเริ่มต้น: สมาชิก struct เป็น public โดยค่าเริ่มต้น สมาชิก class เป็น private โดยค่าเริ่มต้น) เครื่องมือสร้าง struct เป็นค่าเริ่มต้น ในสถานการณ์ดีซีเรียลไลซ์ การใช้ struct จะกระชับและเข้าใจง่ายกว่า; หากต้องการห่อหุ้มสมาชิกส่วนตัว + เมธอดตัวเข้าถึง สามารถเปลี่ยนเป็น class ด้วยตัวเองได้
std::string
ประเภทสตริงของไลบรารีมาตรฐาน C++ (สัญชาตญาณความเป็นเจ้าของ) นิยามใน <string> เครื่องมือนี้จะแมปฟิลด์สตริง JSON เป็น std::string โดยอัตโนมัติ เช่น std::string name ควรทราบว่า std::string แตกต่างจาก char*/char[] ในภาษา C: std::string จัดการหน่วยความจำโดยอัตโนมัติ รองรับการโอเวอร์โหลดตัวดำเนินการ (+, ==, <) แต่จะมีประสิทธิภาพดีที่สุดเมื่อประมวลผลสตริงความยาวเล็กถึงปานกลางเท่านั้น; สำหรับสตริงที่ยาวมาก (เช่น บันทึกทั้งบรรทัด 1KB+) แนะนำให้ใช้ std::string_view หรือบัฟเฟอร์ที่กำหนดเอง
std::vector<T>
คอนเทนเนอร์อาร์เรย์ไดนามิกของไลบรารีมาตรฐาน C++ (<vector>) เทียบเท่ากับ ArrayList ใน Java, list ใน Python, Array ใน JavaScript เครื่องมือนี้จะแมปฟิลด์อาร์เรย์ JSON เป็น std::vector<T> โดยอัตโนมัติ เช่น std::vector<std::string> tags ข้อดี: หน่วยความจำต่อเนื่อง การเข้าถึงสุ่ม O(1) การเพิ่มที่ท้าย O(1) แบบแ amortized; ข้อเสีย: การแทรกตรงกลาง O(n) เมื่อต้องการอาร์เรย์ขนาดคงที่สามารถใช้ std::array<T, N> (จัดสรรบนสแต็ก)
std::optional<T>
ประเภทห่อค่าที่เลือกได้ของไลบรารีมาตรฐานตั้งแต่ C++17 (<optional>) ระบุว่าค่าอาจไม่มีอยู่ การใช้งานทั่วไป: std::optional<std::string> nickname; if (nickname) { use(*nickname); } เครื่องมือนี้จะแมปฟิลด์ JSON ที่อาจเป็น null เป็น std::optional<T> เช่น std::optional<std::string> nickname หากโปรเจกต์ของคุณจำเป็นต้องใช้ C++11/14 สามารถแทนที่ด้วย boost::optional<T> ได้ API เกือบจะเหมือนกัน
int64_t / double
int64_t คือนามแฝงประเภทจำนวนเต็ม 64 บิตที่มีความกว้างคงที่ใน <cstdint> เทียบเท่ากับ long long รับประกัน 8 ไบต์ข้ามแพลตฟอร์ม double คือประเภททศนิยมสองเท่าของ C++ (IEEE 754 สองเท่า/binary64 ประมาณ 15-17 หลักสำคัญ) เครื่องมือนี้จะแมปจำนวนเต็ม JSON เป็น int64_t อย่างสม่ำเสมอ จำนวนทศนิยมเป็น double หลีกเลี่ยงปัญหาความแม่นยำที่เกิดจากขนาด long ไม่สอดคล้องกันข้ามแพลตฟอร์ม (long ใน Windows เป็น 32 บิต long ใน Linux เป็น 64 บิต) เมื่อต้องการทศนิยมที่แม่นยำ (การคำนวณทางการเงิน) สามารถใช้ long double หรือไลบรารี decimal ได้
nlohmann::json
หนึ่งในไลบรารี JSON ยอดนิยมที่สุดในระบบนิเวศ C++ หรือที่เรียกว่า nlohmann/json เผยแพร่โดย Niels Lohmann ชาวเยอรมนี แนวคิดหลักคือการแมปโครงสร้างข้อมูล JSON เป็นประเภทไลบรารีมาตรฐาน C++ (เช่น std::map, std::vector, std::string) เมื่อดีซีเรียลไลซ์สามารถทำได้ในบรรทัดเดียวด้วย j.get<T>() โค้ดที่สร้างโดยเครื่องมือนี้สามารถทำงานร่วมกับ nlohmann/json ได้โดยใช้มาโครเช่น NLOHMANN_DEFINE_TYPE_INTRUSIVE, NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE เพื่อใช้งานดีซีเรียลไลซ์อัตโนมัติ การอ้างอิงเฮดเดอร์เดียว เอกสารที่อุดมสมบูรณ์ API สอดคล้องกับสไตล์ STL เป็นตัวเลือกที่ต้องการสำหรับโปรเจกต์ C++ ส่วนใหญ่
rapidjson
ไลบรารี JSON ประสิทธิภาพสูงโอเพ่นซอร์สจาก Tencent (C++) ประมาณ 5k บรรทัดของโค้ด ประสิทธิภาพสูงกว่า nlohmann::json ประมาณ 3-5 เท่า รองรับสไตล์การแยกวิเคราะห์สองแบบ: SAX (สตรีมมิ่ง) และ DOM (โมเดลอ็อบเจกต์เอกสาร) มีการใช้งานการเร่งความเร็วพิเศษสำหรับคำสั่ง SIMD (เช่น SSE42) สถานการณ์ทั่วไป: การส่งข้อมูลตลาดธุรกรรมทางการเงิน การซีเรียลไลซ์อ็อบเจกต์เอ็นจิ้นเกม การบันทึกประสิทธิภาพสูงในระบบฝังตัว สตรัคเจอร์ที่สร้างโดยเครื่องมือนี้สามารถทำหน้าที่เป็นโมเดลเป้าหมายสำหรับการดีซีเรียลไลซ์ rapidjson Document/GenericValue ได้ แต่เนื่องจาก rapidjson ไม่มีการสะท้อนเทมเพลต จึงจำเป็นต้องแยกฟิลด์ด้วยตัวเองโดยใช้ GetObject/GetString
Web Worker / quicktype-core
Web Worker คือ API เธรดพื้นหลังที่เบราว์เซอร์จัดเตรียม ทำงานขนานกับเธรดหลัก ไม่สามารถเข้าถึง DOM ของเธรดหลักได้ สามารถสื่อสารผ่าน postMessage เท่านั้น quicktype-core คือไลบรารีตัวสร้างโค้ด JSON → หลายภาษาโอเพ่นซอร์ส (GitHub: quicktype/quicktype) รองรับมากกว่าสิบภาษา รวมถึง C++/Java/TypeScript/Rust/Go/Python/Swift เครื่องมือนี้ตาม quicktype-core จะเรนเดอร์โค้ดสตรัคเจอร์ header-only สำหรับ C++ ในเบราว์เซอร์ในเครื่อง ข้อมูลดิบจะไม่ถูกส่งไปยังเซิร์ฟเวอร์ใดๆ การแยกวิเคราะห์ การสร้าง และการดาวน์โหลดทั้งหมดทำในเบราว์เซอร์ Worker ที่โหลด quicktype-core จะหลีกเลี่ยงการบล็อกเธรดหลัก UI
snake_case / camelCase / PascalCase
สไตล์การตั้งชื่อฟิลด์หลักสามแบบ: snake_case (user_name เป็นที่ต้องการใน C/Python/DB), camelCase (userName เป็นที่ต้องการใน Java/JS), PascalCase (UserName เป็นที่ต้องการสำหรับฟิลด์สตรัคเจอร์ C#/Rust) เครื่องมือนี้จะรักษาชื่อฟิลด์เดิมของ JSON ไว้ตามค่าเริ่มต้น (โดยทั่วไปคือ snake_case) คุณสามารถปรับแต่งด้วยตัวเองหลังจากสร้างแล้วเพิ่มมาโคร NLOHMANN เพื่อประกาศการแมป ควรทราบว่ามาตรฐานการตั้งชื่อฟิลด์สาธารณะ C++ แนะนำ camelCase หรือ snake_case PascalCase ใช้สำหรับชื่อคลาสเป็นหลัก (Google C++ Style) ไม่แนะนำให้ใช้กับสมาชิก; snake_case เข้ากันได้กับชื่อคอลัมน์ mySQL ตามธรรมชาติ
NLOHMANN_DEFINE_TYPE_INTRUSIVE
มาโครที่ไลบรารี nlohmann/json จัดเตรียมไว้ ใช้เพื่อประกาศการแมปฟิลด์ซีเรียลไลซ์ JSON ภายในคลาส ไวยากรณ์คือ NLOHMANN_DEFINE_TYPE_INTRUSIVE(ClassName, member1, member2, ...) ต้องวางไว้ในพื้นที่ public (เพื่อให้มาโครเข้าถึงฟิลด์ส่วนตัวได้) เวอร์ชันที่ไม่รุกล้ำ NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE จะวางไว้นอกคลาส ไม่ต้องแก้ไขคลาสเอง สตรัคเจอร์ที่สร้างโดยเครื่องมือนี้จะไม่เพิ่มมาโครดังกล่าวโดยอัตโนมัติ หากจำเป็นให้เพิ่มด้วยตัวเองเพื่อประกาศความสัมพันธ์ระหว่างคีย์ JSON กับสมาชิก C++ หากชื่อฟิลด์ JSON เหมือนกับสมาชิก C++ คุณสามารถข้ามมาโครนี้และใช้ j.get<T>() โดยตรงได้

ตารางอ้างอิงการแมปประเภท JSON เป็นประเภท C++ อย่างรวดเร็ว

เครื่องมือจะอนุมานประเภท C++ ที่สอดคล้องกันโดยอัตโนมัติตามประเภทของค่า JSON:

ตัวอย่างค่า JSONประเภท C++ ที่สร้างหมายเหตุ
nullstd::optional<T>ประเภทค่า null ไม่แน่นอน รองรับด้วย std::optional<T> (C++17+)
true / falseboolค่าบูลีน JSON แมปเป็น bool C++ โดยตรง
42int64_tจำนวนเต็ม JSON แมปเป็น int64_t (<cstdint>) โดยค่าเริ่มต้น เข้ากันได้กับ long long
3.14doubleจำนวนทศนิยม JSON แมปเป็น double (สองเท่า IEEE 754) โดยค่าเริ่มต้น
"hello"std::stringสตริง JSON แมปเป็น std::string (<string>)
["a","b"]std::vector<std::string>อาร์เรย์สตริงแมปเป็น std::vector<std::string>
[1,2,3]std::vector<int64_t>อาร์เรย์จำนวนเต็มแมปเป็น std::vector<int64_t>
[{...},{...}]std::vector<Item>อาร์เรย์อ็อบเจกต์สร้างสตรัคเจอร์ที่สอดคล้องกันตามองค์ประกอบแรก จากนั้นห่อด้วย std::vector
[]std::vector<nlohmann::json>อาร์เรย์ว่างไม่สามารถอนุมานประเภทองค์ประกอบได้ รองรับด้วย nlohmann::json (สามารถเขียนใหม่เป็น std::vector<std::string> ได้ด้วย)
{...} อ็อบเจกต์ซ้อนในสตรัคเจอร์/คลาสอิสระอ็อบเจกต์ซ้อนในสร้างสตรัคเจอร์อิสระ ตั้งชื่อ PascalCase (address → Address)

ตารางเปรียบเทียบการเลือกตัวแยกวิเคราะห์ JSON C++ ยอดนิยม

การเปรียบเทียบไลบรารีแยกวิเคราะห์ JSON หลักในระบบนิเวศ C++ เลือกตามความต้องการของโปรเจกต์:

ชื่อไลบรารีสไตล์ APIประสิทธิภาพสถานการณ์ที่เหมาะสม
nlohmann::jsonเทมเพลต / คล้าย STLปานกลางแบ็กเอนด์เว็บ แอปพลิเคชันเดสก์ท็อป การเรียนการสอน; เข้ากันได้ดีที่สุดกับ std::vector/std::map
rapidjsonSAX / DOMสูงมากธุรกรรมทางการเงิน เอ็นจิ้นเกม บริการที่มีทรูพุตสูง; รองรับการเร่งความเร็ว SIMD
Boost.JSONBoost.Containerสูงโปรเจกต์ระบบนิเวศ Boost เซิร์ฟเวอร์เว็บ (Beast/Asio)
cJSONสไตล์ C / ฟังก์ชันสูงโปรเจกต์ C ระบบฝังตัว C++ สถานการณ์ที่ไม่ต้องการนำเข้าเทมเพลต C++
ArduinoJsonเทมเพลต C++ปานกลางArduino, ESP32/ESP8266, MCU ระบบฝังตัว

ตารางอ้างอิงความสอดคล้องประเภทไลบรารีมาตรฐาน C++ กับ JSON อย่างรวดเร็ว

ภาพรวมของประเภทหลักในไลบรารีมาตรฐาน C++ ที่สอดคล้องกับฟิลด์ JSON สำหรับการอ้างอิงอย่างรวดเร็วของนักพัฒนา:

คำสำคัญ JSONประเภทที่สอดคล้องกันในไลบรารีมาตรฐาน C++ไฟล์เฮดเดอร์ที่ต้องการมาตรฐาน C++
stringstd::string<string>C++98
integerint64_t (<cstdint>)<cstdint>C++11
numberdouble<iostream>/<cmath>C++98
booleanbool<stdbool.h>(C)/ในตัวC++98
nullstd::optional<T><optional>C++17
arraystd::vector<T><vector>C++98
อาร์เรย์คงที่std::array<T, N><array>C++11
อ็อบเจกต์/mapstd::map<std::string, T><map>C++98
แฮชอ็อบเจกต์std::unordered_map<K, T><unordered_map>C++11
string viewstd::string_view (ไม่ได้เป็นเจ้าของข้อมูล)<string_view>C++17
byte/charstd::byte/char<cstddef>C++17/C++98

Privacy & Security

การดำเนินการทั้งหมดของเครื่องมือ JSON เป็น C++ นี้ทำในเบราว์เซอร์ของคุณทั้งหมด: การแยกวิเคราะห์ JSON การสร้างสตรัคเจอร์ C++ และการดาวน์โหลดไฟล์ทั้งหมดทำที่ฝั่งไคลเอ็นต์ผ่าน JavaScript ของเบราว์เซอร์ (Web Worker + quicktype-core) ไม่มีข้อมูล JSON ไฟล์ที่อัปโหลดหรือโค้ดที่สร้างขึ้นจะถูกส่งผ่านเครือข่ายไปยังเซิร์ฟเวอร์ใดๆ การอัปโหลดไฟล์ใช้ FileReader API ดั้งเดิมของเบราว์เซอร์เพื่ออ่านไปยังหน่วยความจำโดยตรงโดยไม่ผ่านบริการตัวกลางใดๆ ไม่ใช้การติดตามคุกกี้ ไม่รวบรวมข้อมูลการป้อนข้อมูลหรือข้อมูลการใช้งานของผู้ใช้ใดๆ หลังจากปิดหรือรีเฟรชหน้า เนื้อหาอินพุตและเอาต์พุตทั้งหมดจะถูกลบออกจากหน่วยความจำโดยอัตโนมัติ เหมาะสำหรับการประมวลผล JSON ที่มีคีย์ API โทเค็น ข้อมูลธุรกิจที่ละเอียดอ่อน

Authoritative References