如何在RapidJSON中对用户输入的字符串使用GetString()方法?
实现命令行动态输入JSON对象名称并取值
我来帮你搞定这个动态取值的需求,结合你用的RapidJSON代码,咱们可以通过以下步骤实现:
核心思路
不再硬编码JSON对象的键名,而是从命令行读取用户输入的对象名称,用这个名称作为动态键去访问JSON结构,同时增加错误处理避免访问不存在的对象导致程序崩溃。
具体实现步骤
- 读取用户输入:由于对象名称可能包含空格(比如你的示例里的"Rogue Refiner"),要用
getline来读取完整输入,避免被空格截断。 - 动态访问JSON对象:将用户输入的字符串作为键,替代原来硬编码的"Rogue Refiner",去访问JSON中的对应对象。
- 错误校验:先检查用户输入的对象是否存在于JSON中,且是一个合法的对象类型,再去获取字段值。
完整代码示例
#include <iostream> #include <string> #include "rapidjson/document.h" using namespace rapidjson; int main() { // 模拟包含大量对象的JSON数据(这里包含你的示例对象) const std::string data = R"( { "Rogue Refiner": { "name": "Rogue Refiner", "power": "3", "toughness": "2" }, "Goblin Raider": { "name": "Goblin Raider", "power": "2", "toughness": "1" }, "Elvish Archer": { "name": "Elvish Archer", "power": "1", "toughness": "1" } } )"; // 解析JSON Document d; d.Parse(data.c_str()); if (d.HasParseError()) { std::cerr << "JSON解析失败!错误码:" << d.GetParseError() << std::endl; return 1; } // 提示用户输入对象名称 std::cout << "请输入要查询的JSON对象名称:"; std::string objName; std::getline(std::cin, objName); // 检查对象是否存在且为合法对象 if (d.HasMember(objName.c_str()) && d[objName.c_str()].IsObject()) { const Value& obj = d[objName.c_str()]; // 获取name字段的字符串值(同样可以扩展获取power、toughness等) if (obj.HasMember("name") && obj["name"].IsString()) { std::cout << "对应对象的name值为:" << obj["name"].GetString() << std::endl; } else { std::cerr << "该对象不包含合法的name字段!" << std::endl; } } else { std::cerr << "未找到名称为\"" << objName << "\"的JSON对象!" << std::endl; } return 0; }
关键细节说明
- 处理带空格的输入:用
std::getline(std::cin, objName)而不是std::cin >> objName,因为后者遇到空格就会停止读取,无法获取完整的对象名称。 - 安全访问JSON:每次访问前用
HasMember检查键是否存在,用IsObject/IsString检查值的类型,避免因JSON结构不符合预期导致程序崩溃。 - RapidJSON的字符串处理:RapidJSON的
HasMember和下标运算符接受const char*类型的键,所以需要把std::string转成c_str()。
内容的提问来源于stack exchange,提问作者Terren Huck
相关产品推荐
相关产品推荐

