jsoncpp判断key是否存在以及类型

简单地说,可以用isMember()进行判断存在与否,类型需要使用is....()具体判断:

#include "../common.h"
#include <jsoncpp/json/json.h>

int main()
{
    ifstream readFile("123.json",ios::binary);
    if(!readFile.is_open())
    {
        printf("open fail\n");
        return -1;
    }
    else
    {
        Json::Reader reader;
        Json::Value root;
        if(reader.parse(readFile,root))  //reader将文件中的内容解析到root
        {
            cout << "ID: " << root["ID"].asInt() << endl;
            cout << "longitude: " << root["longitude"].asFloat() << endl;
            cout << "latitude: " << root["latitude"].asFloat() << endl;
            cout << "openFlag: " << root["openFlag"].asBool() << endl;
            cout << "name: " << root["name"].asString() << endl;
            for(int i = 0; i < root["data"].size(); ++i)
            {
                printf("data[%d]: %d\n",i,root["data"][i].asInt());
            }
            /*不加判断会打印值*/
            cout << "testSave1:" << root["testSave1"].asString() << endl;
            cout << "testSave2:" << root["testSave2"].asFloat() << endl;
            cout << "testSave3:" << root["testSave3"].asInt() << endl;
            cout << "testSave4:" << root["testSave4"].asBool() << endl;
            cout << "testSave5:" << root["testSave5"].asUInt() << endl;
            
            if(root.isMember("testSave6"))  //不存在
            {
                cout << "testSave6:" << root["testSave6"].asUInt() << endl;
            }
            else
            {
                cout << "testSave6 is not exist ..." << endl;
            }

            if(root.isMember("name")) //存在
            {
                cout << "name:" << root["name"].asString() << endl;
            }
            else
            {
                cout << "name is not exist ..." << endl;
            }
            
            if(root["test"].isMember("test1")) //二级key类似用法
            {
                cout << "name:" << root["test"]["test1"].asInt() << endl;
            }
            else
            {
                cout << "test.test1 is not exist ..." << endl;
            }
            
            if(root["test"].isString())  //类型判断
            {
                cout << "[test] is string" << endl;
            }

            if(root["test"].isObject()) //类型判断
            {
                cout << "[test] is object" << endl;
            }

            if(root["name"].isString()) //类型判断
            {
                cout << "[name] is string" << endl;
            }
        }
        else
        {
            cout << "no reader" << endl;
        }
        readFile.close();
        return 0;
    }
}

123.json:

{
    "ID": 20,
    "longitude": 112.12345,
    "latitude": 28.67890,
    "num": 123,
    "openFlag": true,
    "name": "xi xi",
    "data": [4, 2, 3, 4, 5],
    "test": {
        "test1": 1,
        "test2": 2
    }
}

结果:

ID: 20
longitude: 112.123
latitude: 28.6789
openFlag: 1
name: xi xi
data[0]: 4
data[1]: 2
data[2]: 3
data[3]: 4
data[4]: 5
testSave1:
testSave2:0
testSave3:0
testSave4:0
testSave5:0
testSave6 is not exist ...
name:xi xi
name:1
[test] is object
[name] is string

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JsonCpp中,我们可以使用以下函数来判断一个JSON值的数据类型: 1. `isBool()`:判断是否为布尔类型(true/false); 2. `isInt()`:判断是否为整型; 3. `isUInt()`:判断是否为无符号整型; 4. `isDouble()`:判断是否为双精度型; 5. `isString()`:判断是否为字符串类型; 6. `isArray()`:判断是否为数组类型; 7. `isObject()`:判断是否为对象类型; 8. `isNull()`:判断是否为null。 这些函数都返回一个bool类型的值,如果判断为真则代表该JSON值是对应的数据类型,否则不是。下面是一个例子: ```c++ #include <iostream> #include <json/json.h> int main() { Json::Value value; // 布尔类型 value = true; std::cout << value.isBool() << std::endl; // 输出1 // 整型 value = 123; std::cout << value.isInt() << std::endl; // 输出1 // 无符号整型 value = 456u; std::cout << value.isUInt() << std::endl; // 输出1 // 双精度型 value = 3.14; std::cout << value.isDouble() << std::endl; // 输出1 // 字符串类型 value = "hello"; std::cout << value.isString() << std::endl; // 输出1 // 数组类型 value = Json::Value(Json::arrayValue); value.append(1); value.append(2); value.append(3); std::cout << value.isArray() << std::endl; // 输出1 // 对象类型 value = Json::Value(Json::objectValue); value["name"] = "Tom"; value["age"] = 18; std::cout << value.isObject() << std::endl; // 输出1 // null类型 value = Json::Value(Json::nullValue); std::cout << value.isNull() << std::endl; // 输出1 return 0; } ``` 需要注意的是,如果一个JSON值既可以是一个数组,又可以是一个对象,那么它的数据类型会被判断为对象类型。例如: ```c++ #include <iostream> #include <json/json.h> int main() { Json::Value value; value = Json::Value(Json::arrayValue); value.append(1); value.append(2); value.append(3); value["name"] = "Tom"; // 添加一个键值对 std::cout << value.isArray() << std::endl; // 输出0 std::cout << value.isObject() << std::endl; // 输出1 return 0; } ``` 在这个例子中,我们创建了一个JSON值,并将其设置为一个数组类型。然后,我们添加了一个键值对,这时它的数据类型判断为对象类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值