boost::json: Wie man überprüft, ob ein Wert existiert und einen bestimmten Typ hat
Es gibt zwei Methoden, um in boost::json zu überprüfen, ob ein Wert existiert und einen bestimmten Typ hat. Unten finden Sie ein vollständiges Beispiel, in dem Sie beide Methoden testen können. Ich empfehle generell Option 1, da es mühsam ist, alle Überprüfungen zu 100% korrekt durchzuführen und man oft einige Randfälle vergisst.
Nur für Embedded-Systeme, bei denen Exceptions deaktiviert sind (und deren Aktivierung keine Option ist), ist Option 2 der richtige Weg.
Option 1: Exceptions abfangen
check_value.cpp
void extractTimestamp(const boost::json::value& jv) {
try {
double timestamp = jv.as_object().at("timestamp").as_double();
std::cout << "Timestamp: " << timestamp << std::endl;
} catch (const boost::system::system_error& e) {
std::cerr << "Error" << e.code() << ": " << e.what() << std::endl;
}
}Option 2: Explizite Überprüfungen verwenden
check_value_explicit.cpp
void extractTimestamp2(const boost::json::value& jv) {
// Extract the timestamp as a double
if (jv.is_object() && jv.as_object().contains("timestamp")) {
double timestamp = jv.as_object().at("timestamp").as_double();
std::cout << "Timestamp: " << timestamp << std::endl;
} else {
std::cerr << "Error: 'timestamp' field is missing in the JSON data." << std::endl;
}
}Vollständiger Testfall
check_value_test.cpp
#include <boost/json.hpp>
#include <iostream>
// TODO: Insert one of the extractTimestamp functions here!
int main() {
// Test with correct JSON
{
std::string line = "{\"timestamp\":1675910171.91}";
boost::json::value jv = boost::json::parse(line);
extractTimestamp(jv);
}
// Test with incorrect JSON #1
{
std::string line = "{}";
boost::json::value jv = boost::json::parse(line);
extractTimestamp(jv);
}
// Test with incorrect JSON #2
{
std::string line = "[]";
boost::json::value jv = boost::json::parse(line);
extractTimestamp(jv);
}
return 0;
}Ausgabe für Option 1:
output_option1.txt
Timestamp: 1.67591e+09
Error boost.json:17: out of range [boost.json:17 at /usr/include/boost/json/impl/object.hpp:388 in function 'at']
Error boost.json:31: value is not an object [boost.json:31 at /usr/include/boost/json/value.hpp:2529 in function 'as_object']Ausgabe für Option 2:
Beachten Sie, dass die Fehlermeldung hier nicht sehr spezifisch ist.
output_option2.txt
Timestamp: 1.67591e+09
Error: 'timestamp' field is missing in the JSON data.
Error: 'timestamp' field is missing in the JSON data.If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow