我需要使用RapidJSON的帮助

时间:2018-03-28 18:58:50

标签: 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"
],
"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.";
}

1 个答案:

答案 0 :(得分:1)

您的帖子似乎提出了多个问题。让我们从头开始。

  

我相信我已经正确地将JSON存储为C字符串,我只是不能   真的了解如何使用RapidJSON库返回   我希望从每个对象获得的值。

这在软件工程中是一个很大的禁忌。永远不要相信或假设。它将在发布日回来并困扰着你。而是验证你的断言。以下是从容易到更多参与的几个步骤。

  1. 打印出您的C-String。
  2. 确认变量内容(尤其是字符串数据)的最简单方法是简单地打印到屏幕上。没有什么比看到您的JSON数据打印到屏幕上更容易确认您已正确阅读它。

    std::cout.write(bytes, filesize);
    
    1. 断点/调试器
    2. 如果您有理由不打印变量,请在启用调试的情况下编译代码,如果您使用GDB g++ lldb,请加载clang++ #39;重新使用 // 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); ,或者只是在视觉工作室中放置一个断点,如果你正在使用VS或VSCode。一旦到达断点,您可以检查变量的内容。

      然而,在我们继续前进之前,如果我没有指出在CPP中阅读文件比你阅读的方式容易得多,我就不会帮助你。

      std::string

      在上面的代码的末尾,您现在可以将文件中的所有内容读入.c_str(),其中包含空终止或C-String。您可以通过调用字符串实例上的new来访问该数据。如果你这样做,你不再需要担心调用delete[]std::string,因为Document d; d.Parse(data.c_str()); 类会为你处理缓冲区。只要您在RapidJSON中使用它,就确保它会挂起。

        

      这是将JSON存储为C字符串然后解析的代码   如果我在这里做错了。

      没有。根据快速JSON文档,您可以创建一个文档对象并让它解析字符串。

      d.hasMember("")

      但是,这只是创建用于查询文档的元素。您可以询问文档是否存在特定项目(d["name"].GetString()),询问字符串类型成员内容does google not work today或文档中列出的任何内容。您可以阅读教程here

      顺便说一下。欢迎来到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'; } 回复。

      https://stackoverflow.com/help/how-to-ask

      **更新** 对你的问题。您可以迭代所有对象。

      gcloud sql instances patch [INSTANCE_NAME] --activation-policy NEVER