c++的json库

现在c++的库其实实现都差不多,因为没有c++没有反射功能,所以只能按照键值对方式组合和解析。每个库原理差不多,主要是接口的实现。

目前有很多库了,只介绍4个。

json11,rapidjson,jsoncpp,nlohmann

大家自己查阅官方文档吧,总体都是类似map这样的。

用jsoncpp举例,主要就是value类型

int ParseJsonFromString()
{
    const char* str = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";
    Json::Reader reader;
    Json::Value root;
    if (reader.parse(str, root))  // reader将Json字符串解析到root,root将包含Json里所有子元素   
    {
        std::string upload_id = root["uploadid"].asString();  // 访问节点,upload_id = "UP000000"   
        int code = root["code"].asInt();    // 访问节点,code = 100   
    }
    return 0;
}

很多库的使用都是这样的。

nlohmann库需要实现解析过程。

以下是json字符串解析:

int  ParseJson()
{
    // create object from string literal
    json j = "{ \"happy\": true, \"pi\": 3.141 }"_json;
    // or even nicer with a raw string literal
    auto j2 = R"(
  {
    "happy": true,
    "pi": 3.141
  }
)"_json;

    std::string s = j.dump();
    return 0;
}

如果需要将json字符串与结构体转换

struct MyContainer {
    std::string name;
    std::string address;
    int age;
    list lst;
    double score;

};
//1.重载转换函数
void to_json(nlohmann::json& j, const MyContainer& p) {
    j = json{ {"name", p.name}, {"address", p.address}, {"score", p.score},{"age",p.age},{"lst",p.lst} };
}

void from_json(const nlohmann::json& j, MyContainer& p) {
    j.at("name").get_to(p.name);
    j.at("address").get_to(p.address);
    j.at("score").get_to(p.score);
    j.at("age").get_to(p.age);
    j.at("lst").get_to(p.lst);
}

需要在同名称空间实现上面的方法,c++没有反射,需要自己实现映射关系。以上接口方法就是需要结构体与json类型建立映射关系。

int defParseJson()
{
    MyContainer c;
    c.age = 3;
    c.name = "jnoy";
    c.score = 6;
    c.lst.push_back("aa");
    c.lst.push_back("cc");

    json j = c;//将结构体转换成json对象
    std::string str= j.dump();//转换字符串
    std::cout << str << std::endl;

    //必须在同名称空间,实现to_json,from_json
   auto p= j.get();//转换结构体
   // json k = c;
    return 0;
}

准备好以后的序列化和反序列化。

你可能感兴趣的:(库,json)