- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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.";
}
最佳答案
您的帖子似乎提出了多个问题。让我们从头开始。
I believe I have stored the JSON as a C string correctly I just can't really understand how to use the RapidJSON library to return the values I want from each object.
这是软件工程中的一个大禁忌。永远不要相信或假设。它会在发布日回来并困扰你。而是验证您的断言。以下是从简单到复杂的几个步骤。
确认变量内容(尤其是字符串数据)的最简单方法是简单地打印到屏幕上。没有什么比看到您的 JSON 数据打印到屏幕上以确认您已正确读取它更容易的了。
std::cout.write(bytes, filesize);
如果你有一些原因不打印出你的变量,然后编译你的代码并启用调试并加载到 GDB
如果你使用 g++
, lldb
如果您使用的是 clang++
,或者如果您使用的是 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);
在上述代码的末尾,您现在已将文件中的所有内容读入 std::string
,它包装了一个空终止符或 C 字符串。您可以通过在字符串实例上调用 .c_str()
来访问该数据。如果你这样做,你就不必再担心调用 new
或 delete[]
因为 std::string
类会处理给你的缓冲区。只需确保只要您在 RapidJSON 中使用它,它就会一直存在。
This is the code for storing the JSON as a C string and then parsing it in case I am doing something incorrect here.
没有。根据快速 JSON 文档,您创建一个文档对象并让它解析字符串。
Document d;
d.Parse(data.c_str());
但是,这只是创建用于查询文档的元素。您可以询问文档是否存在特定项 (d.hasMember("")
),询问字符串类型的成员内容 d["name"].GetString()
或文档中列出的任何内容。可以看教程here .
顺便说一下。欢迎来到 SO。我建议您下次发帖时问一个更有针对性的问题。你到底想用解析后的 JSON 元素做什么?
I just can't really understand how to use the RapidJSON library to return the values I want from each object.
我不能回答这个问题有两个原因。你想提取什么?你试过什么?您是否阅读了文档并且不了解特定项目?
这里是阅读有关提出更好问题的好地方。请不要以为我在贬低你。我提出这个问题是因为提出更好的问题会让你得到更好、更具体的答案。问得不好的问题总是有被忽视的风险,或者,我敢说,好的老式does google not work today
响应。
https://stackoverflow.com/help/how-to-ask
** 更新 **对于你的问题。您可以遍历所有对象。
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';
}
关于c++ - 我需要帮助使用 RapidJSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49542209/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!