C++ 我需要帮助使用RapidJSON

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

我正在尝试使用RapidJSON解析一个JSON文件,该文件包含数千个像这样的对象

"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';
         }