C++ 我需要帮助使用RapidJSON
我正在尝试使用RapidJSON解析一个JSON文件,该文件包含数千个像这样的对象C++ 我需要帮助使用RapidJSON,c++,json,rapidjson,C++,Json,Rapidjson,我正在尝试使用RapidJSON解析一个JSON文件,该文件包含数千个像这样的对象 "Amateur Auteur": { "layout": "normal", "name": "Amateur Auteur", "manaCost": "{1}{W}", "cmc": 2, "colors": [ "White" ], "type": "Creature — Human", "types": [ "Creature" ], "subtypes": [ "Human" ], "te
"Amateur Auteur": {
"layout": "normal",
"name": "Amateur Auteur",
"manaCost": "{1}{W}",
"cmc": 2,
"colors": [
"White"
],
"type": "Creature — Human",
"types": [
"Creature"
],
"subtypes": [
"Human"
],
"text": "Sacrifice Amateur Auteur: Destroy target enchantment.",
"power": "2",
"toughness": "2",
"imageName": "amateur auteur",
"colorIdentity": [
"W"
]
},
我相信我已经将JSON正确地存储为C字符串,我只是不太明白如何使用RapidJSON库从每个对象返回我想要的值
这是将JSON存储为C字符串的代码,如果我在这里做了一些不正确的事情,可以对其进行解析
std::ifstream input_file_stream;
input_file_stream.open("AllCards.json", std::ios::binary | std::ios::ate); //Open file in binary mode and seek to end of stream
if (input_file_stream.is_open())
{
std::streampos file_size = input_file_stream.tellg(); //Get position of stream (We do this to get file size since we are at end)
input_file_stream.seekg(0); //Seek back to beginning of stream to start reading
char * bytes = new char[file_size]; //Allocate array to store data in
if (bytes == nullptr)
{
std::cout << "Failed to allocate the char byte block of size: " << file_size << std::endl;
}
input_file_stream.read(bytes, file_size); //read the bytes
document.Parse(bytes);
input_file_stream.close(); //close file since we are done reading bytes
delete[] bytes; //Clean up where we allocated bytes to prevent memory leak
}
else
{
std::cout << "Unable to open file for reading.";
}
std::ifstream输入\u文件\u流;
输入文件_stream.open(“AllCards.json”,std::ios::binary | std::ios::ate)//以二进制模式打开文件并查找流的结尾
if(输入文件\u stream.is\u open())
{
std::streampos file_size=input_file_stream.tellg();//获取流的位置(我们这样做是为了获取文件大小,因为我们在末尾)
input_file_stream.seekg(0);//返回到流的开头开始读取
char*bytes=new char[file_size];//分配数组以存储数据
如果(字节==nullptr)
{
std::cout你的帖子似乎问了很多问题。让我们从头开始
我相信我已经将JSON正确地存储为C字符串,我就是不能
真正了解如何使用RapidJSON库返回
我希望从每个对象获得的值
这是软件工程中的一个大禁忌。永远不要相信或假设。它会在发布之日再次出现并困扰你。相反,请验证你的断言。以下是从简单到更复杂的几个步骤
打印出您的C字串。
确认变量内容(尤其是字符串数据)的最简单方法是简单地打印到屏幕上。没有比看到JSON数据打印到屏幕上确认您已正确读取更简单的方法了
std::cout.write(bytes, filesize);
断点/调试器
如果您有理由不打印变量,那么在启用调试的情况下编译代码,如果您使用的是g++
,则加载到GDB
,如果您使用的是clang++
,则加载到lldb
,如果您使用的是VS或VSCode>,则只需在visual studio中放置一个断点即可。在断点处,您可以检查变量的内容
然而,在我们继续之前,如果我没有指出在CPP中读取文件要比您阅读的方式容易得多,我就不会帮助您
// Open File
std::ifstream in("AllCards.json", std::ios::binary);
if(!in)
throw std::runtime_error("Failed to open file.");
// dont skip on whitespace
std::noskipws(in);
// Read in content
std::istreambuf_iterator<char> head(in);
std::istreambuf_iterator<char> tail;
std::string data(head, tail);
但是,这只是创建用于查询文档的元素。您可以询问文档是否存在特定项(d.hasMember(“”
),询问字符串类型的成员内容d[“name”].GetString()
,或者文档中列出的任何内容。您可以阅读本教程
顺便说一句。欢迎来到SO。我建议下次发帖时问一个更有针对性的问题。你到底想对解析后的JSON元素做什么
我真的不明白如何使用RapidJSON库
从每个对象返回我想要的值
我无法回答这个问题有两个原因。您想提取什么?您尝试了什么?您是否阅读了文档而不理解某个特定项目
这里是一个阅读提出更好问题的好地方。请不要认为我是在贬低你。我之所以提出这个问题,是因为提出更好的问题会让你得到更好、更具体的答案。问得不好的问题总是有被忽视的风险,或者,我敢说,好的传统的谷歌现在不起作用了
**更新**
你可以迭代所有的对象
using namespace rapidjson;
Document d;
d.Parse(data.c_str());
for (auto itr = d.MemberBegin(); itr != d.MemberEnd(); ++itr){
std::cout << itr->name.GetString() << '\n';
}
使用名称空间rapidjson;
文件d;
d、 解析(data.c_str());
对于(自动itr=d.MemberBegin();itr!=d.MemberEnd();++itr){
std::cout name.GetString()我试着打印出我的C字符串,它确实起了作用,所以这很好。我对您所说的解析C字符串的部分有点困惑。如果我理解正确,您可以将json文件存储为C字符串,然后使用“document.parse(json);”解析它,除非您的意思是“否”在中,我没有做任何错误的事情。我试图询问某些成员是否存在“document.hasMember(“业余Ateur”)”,但我得到了这个错误。断言失败:IsObject(),/rapidjson/document.h,第1162So行实际上,在使用教程中的示例json文件进行测试之后,我已经实现了这一点!剩下的唯一问题是如何使用我前面显示的文件。我需要能够选择一个特定的对象,如“业余Ateur”然后可以打印它的名称、文本和其他内容。非常感谢您的帮助。发布一个指向整个JSON文件的链接。我感觉它不是顶级对象,可能嵌入到数组或其他东西中。如果您喜欢答案,请接受它=重复我的答案。这是一个迭代顶级对象所有成员的示例vel对象。好的,这很好。我知道我在寻求很多帮助,但是你认为你可以给我看一些如何命名对象的示例代码,然后从中获得一个特定的值吗?例如,如果我想打印业余Ateur的文本?
using namespace rapidjson;
Document d;
d.Parse(data.c_str());
for (auto itr = d.MemberBegin(); itr != d.MemberEnd(); ++itr){
std::cout << itr->name.GetString() << '\n';
}