除了 Holt 的回答,您还可以利用operator==
库定义,其中指出:
整数和浮点数在比较之前会自动转换。请注意,两个 NaN 值始终被视为不相等。
这里发生的是数字溢出,这意味着json["val"] != json["val"].get<int>()
. 免责声明:我不知道这种方法与 Holt 的方法相比有多有效
#include <iostream>
#include <nlohmann/json.hpp>
int main()
{
auto jsonText = "{ \"val\" : 4294967296 }";
auto json = nlohmann::json::parse(jsonText);
auto val = json["val"].get<long long>();
auto i = json["val"].get<int>();
bool longOverflow = json["val"] != val;
bool intOverflow = json["val"] != i;
std::cout << std::boolalpha << "Long: " << longOverflow << "\nInt: " << intOverflow;
}
印刷:
Long: false
Int: true
在线尝试
请注意,这有一个警告:如果存储在 JSON 中的值是 double 或 float,并且作为 long 或 int 检索,它自然会评估为 true (12.3 != 12),但它没有表示溢出。您可以使用is_number_integer()
(检查 int、long 和各种其他类型,无符号或有符号)和is_number_float()
(检查 double/float)来检查一般类型。
据我所知,从 int/long 到 double 不会失败。但是,如果数字足够大,库将无法解析数字( json.exception.out_of_range.406
),因此库施加了硬限制。据我所知,该限制设置为1.79769e+308
(至少在 Wandbox 上)或最大双精度值。这也使 double 成为库中唯一不能溢出的类型。
至于在您使用某种类型检索它时自动检查数字溢出,开箱即用不支持。