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 ด้วยตัวเองเพื่อทำการแมปฟิลด์
วิธีการใช้งาน
- วางเนื้อหา JSON ในตัวแก้ไขทางด้านซ้าย (แนะนำให้เป็นอ็อบเจกต์ JSON) หรือคลิกปุ่มอัปโหลดเพื่อเลือกไฟล์ .json/.txt
- เครื่องมือใช้ quicktype-core ผ่าน Web Worker เพื่อแปลงโดยอัตโนมัติภายใน 400ms โค้ดไฟล์เฮดเดอร์ C++ ที่มี std::string/std::vector<T>/คลาสซ้อนในจะแสดงทางด้านขวา
- หากรูปแบบ JSON ไม่ถูกต้องจะมีข้อความสีแดงปรากฏขึ้น คลิกปุ่ม 'ซ่อมแซม JSON' เพื่อซ่อมแซมปัญหาทั่วไปเช่น จุลภาคท้าย คำพูดเดี่ยวโดยอัตโนมัติจากนั้นลองอีกครั้ง
- ตรวจสอบว่าชื่อสตรัคเจอร์/คลาสและประเภทฟิลด์ที่สร้างขึ้นเป็นไปตามที่คาดหวังหรือไม่ หากต้องการปรับเปลี่ยนให้แก้ไขชื่อคีย์ใน JSON ต้นทางแล้วแปลงใหม่
- คลิก 'คัดลอก' เพื่อวางโค้ดลงในไฟล์ .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
cpprapidjson ไม่สนับสนุนการดีซีเรียลไลซ์อัตโนมัติไปยังสตรัคเจอร์ที่กำหนดเอง จำเป็นต้องแยกฟิลด์ด้วยตัวเองโดยใช้ 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 หรือ rapidjson
ทีมส่วนใหญ่แนะนำให้ใช้ nlohmann::json ก่อน เนื่องจาก API มีลักษณะคล้าย STL เมื่อดีซีเรียลไลซ์ j.get<User>() เพียงบรรทัดเดียวก็เพียงพอ ความสามารถในการอ่านสูงมาก เปลี่ยนไปใช้ rapidjson เฉพาะเมื่อคุณพบปัญหาคอขวดของประสิทธิภาพ (เช่น การแยกฟิลด์ JSON หลายล้านฟิลด์ต่อวินาที) สตรัคเจอร์ที่สร้างโดยเครื่องมือนี้สามารถทำงานร่วมกับทั้งสองได้
ที่เก็บ nlohmann/jsonที่เก็บ rapidjsonในโปรเจกต์ CMake แนะนำให้เพิ่ม nlohmann/json ด้วย FetchContent
การใช้ include(FetchContent) + FetchContent_Declare(nlohmann_json URL ...) เป็นวิธีที่สะอาดที่สุดในการรวม nlohmann/json ใน CMaker ไม่จำเป็นต้องติดตั้ง vcpkg ล่วงหน้า; หากไม่ต้องการตั้งค่า FetchContent สามารถใช้ vcpkg install nlohmann-json หรือดาวน์โหลดไฟล์ json.hpp เดี่ยวโดยตรงแล้วรวมเข้าไป
เอกสารอย่างเป็นทางการ CMake FetchContentฟิลด์ JSON snake_case ต้องเพิ่มมาโคร NLOHMANN หลังการแปลง
เครื่องมือจะรักษาชื่อฟิลด์เดิมของ JSON (snake_case) ตามค่าเริ่มต้น หากคุณต้องการให้สมาชิก C++ เป็น camelCase หรือ PascalCase คุณต้องเพิ่ม NLOHMANN_DEFINE_TYPE_INTRUSIVE(UserProfile, id, userName, ...) ภายในคลาสเพื่อแมปคีย์ JSON กับสมาชิก C++ อย่างชัดเจน มิฉะนั้นดีซีเรียลไลซ์จะล้มเหลว
เอกสาร NLOHMANN_DEFINE_TYPE_INTRUSIVEวิธีแทนที่ std::optional เมื่อใช้มาตรฐาน C++ ที่แตกต่างกัน
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::optionalMCU ระบบฝังตัวไม่ควรใช้ std::vector/std::string โดยตรง
บนอุปกรณ์ที่มี RAM น้อยมากเช่น Arduino Uno/ESP8266 std::vector และ std::string มักจะทำให้เกิด OOM แทนที่จะนั้นให้ใช้ ArduinoJson 6.x + StaticJsonDocument<ความจุ> เพื่อจำกัดบัฟเฟอร์ แทนที่ std::vector<T> ด้วย std::array<T, N> ขนาดคงที่ และ std::string ด้วย const char* + ความยาว
เอกสาร ArduinoJsonJSON ที่ละเอียดอ่อนจะไม่ถูกอัปโหลด
การแยกวิเคราะห์ การสร้างโค้ดและการดาวน์โหลดไฟล์ทั้งหมดของเครื่องมือนี้ทำในเบราว์เซอร์ในเครื่องผ่าน Web Worker JSON ดั้งเดิมจะไม่ถูกส่งไปยังเซิร์ฟเวอร์ใดๆ แต่ยังแนะนำให้: ① ทำให้โมเดลธุรกิจภายในไม่ละเอียดอ่อนก่อน (ลบโทเค็น/หมายเลขโทรศัพท์ ฯลฯ); ② การปิดหน้าจะล้างหน่วยความจำ; ③ ในสถานการณ์การปฏิบัติตามกฎระเบียบของบริษัทขนาดใหญ่ แนะนำให้ประมวลผล JSON ที่มีข้อมูลลูกค้าด้วยบรรทัดคำสั่ง quicktype ในเครื่องใน IDE
แบ่งสตรัคเจอร์เมื่อการซ้อนในลึกเกินไป
JSON ที่มีการซ้อนในมากกว่า 6 ระดับแนะนำให้ปรับโครงสร้างใหม่ที่ฝั่งต้นทาง หรือแบ่งโครงสร้างที่ซ้อนในลึกเป็นสตรัคเจอร์ระหว่างกลางด้วยตัวเองหลังจากสร้างโดยเครื่องมือนี้เพื่อปรับปรุงความสามารถในการอ่านและความเร็วในการคอมไพล์ การซ้อนในลึกจะทำให้ความลึกของการอินสแตนซ์เทมเพลตลึกเกินไป คอมไพเลอร์เก่าบางตัว (ต่ำกว่า GCC 6) จะให้ข้อผิดพลาด 'เกินความลึกของการอินสแตนซ์เทมเพลต'
ใช้ .hpp แทน .h เป็นนามสกุลไฟล์
โค้ดที่สร้างโดยเครื่องมือนี้โดยพื้นฐานแล้วคือ 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++ ที่สร้าง | หมายเหตุ |
|---|---|---|
null | std::optional<T> | ประเภทค่า null ไม่แน่นอน รองรับด้วย std::optional<T> (C++17+) |
true / false | bool | ค่าบูลีน JSON แมปเป็น bool C++ โดยตรง |
42 | int64_t | จำนวนเต็ม JSON แมปเป็น int64_t (<cstdint>) โดยค่าเริ่มต้น เข้ากันได้กับ long long |
3.14 | double | จำนวนทศนิยม 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 |
rapidjson | SAX / DOM | สูงมาก | ธุรกรรมทางการเงิน เอ็นจิ้นเกม บริการที่มีทรูพุตสูง; รองรับการเร่งความเร็ว SIMD |
Boost.JSON | Boost.Container | สูง | โปรเจกต์ระบบนิเวศ Boost เซิร์ฟเวอร์เว็บ (Beast/Asio) |
cJSON | สไตล์ C / ฟังก์ชัน | สูง | โปรเจกต์ C ระบบฝังตัว C++ สถานการณ์ที่ไม่ต้องการนำเข้าเทมเพลต C++ |
ArduinoJson | เทมเพลต C++ | ปานกลาง | Arduino, ESP32/ESP8266, MCU ระบบฝังตัว |
ตารางอ้างอิงความสอดคล้องประเภทไลบรารีมาตรฐาน C++ กับ JSON อย่างรวดเร็ว
ภาพรวมของประเภทหลักในไลบรารีมาตรฐาน C++ ที่สอดคล้องกับฟิลด์ JSON สำหรับการอ้างอิงอย่างรวดเร็วของนักพัฒนา:
| คำสำคัญ JSON | ประเภทที่สอดคล้องกันในไลบรารีมาตรฐาน C++ | ไฟล์เฮดเดอร์ที่ต้องการ | มาตรฐาน C++ |
|---|---|---|---|
| string | std::string | <string> | C++98 |
| integer | int64_t (<cstdint>) | <cstdint> | C++11 |
| number | double | <iostream>/<cmath> | C++98 |
| boolean | bool | <stdbool.h>(C)/ในตัว | C++98 |
| null | std::optional<T> | <optional> | C++17 |
| array | std::vector<T> | <vector> | C++98 |
| อาร์เรย์คงที่ | std::array<T, N> | <array> | C++11 |
| อ็อบเจกต์/map | std::map<std::string, T> | <map> | C++98 |
| แฮชอ็อบเจกต์ | std::unordered_map<K, T> | <unordered_map> | C++11 |
| string view | std::string_view (ไม่ได้เป็นเจ้าของข้อมูล) | <string_view> | C++17 |
| byte/char | std::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
- บีบอัด JSON
- แปลง CSV เป็น JSON
- JSON เป็น CSV
- JSON Diff
- JSON Escape / Unescape
- แฟลตเทน JSON
- จัดรูปแบบ JSON
- เครื่องมือสร้าง JSON
- คิวรี JSONPath
- รวม JSON
- ซ่อมแซม JSON
- ตัวตรวจสอบ JSON Schema
- เรียง JSON
- JSON Stringify
- JSON เป็น HTML
- JSON เป็น Java
- JSON เป็น Markdown
- แปลง JSON เป็น SQL
- JSON เป็น TOML
- JSON เป็น TypeScript
- แปลง XML เป็น JSON
- แปลง JSON เป็น XML
- YAML เป็น JSON
- JSON → YAML
- JSON เป็น Go
- JSON เป็น Rust
- JSON to Swift
- JSON เป็น C#
- JSON เป็น C++
- JSON เป็น PHP
- JSON เป็น Python