我需要帮助使用 RapidJSON
I need help using 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 库来 return 我想要的值每个对象。
这是将 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.";
}
您的 post 似乎提出了多个问题。让我们从头开始。
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.
这是软件工程中的一大禁忌。永远不要相信或假设。它会在发布日回来并困扰你。而是验证您的断言。以下是从简单到复杂的几个步骤。
- 打印出你的C-String.
确认变量内容(尤其是字符串数据)的最简单方法是简单地打印到屏幕上。没有什么比看到您的 JSON 数据打印到屏幕上以确认您已正确阅读它更容易的了。
std::cout.write(bytes, filesize);
- 断点/调试器
如果您出于某种原因不打印出您的变量,则在启用调试的情况下编译您的代码,如果您使用 g++
,则加载 GDB
,如果您使用 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-String。您可以通过在字符串实例上调用 .c_str()
来访问该数据。如果您这样做,您就不必再担心调用 new
或 delete[]
,因为 std::string
class 会为您处理缓冲区。只要确保它在 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。我建议您下次 post 提出更有针对性的问题。你到底想用解析后的 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://whosebug.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';
}
我正在尝试使用 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 库来 return 我想要的值每个对象。
这是将 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.";
}
您的 post 似乎提出了多个问题。让我们从头开始。
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.
这是软件工程中的一大禁忌。永远不要相信或假设。它会在发布日回来并困扰你。而是验证您的断言。以下是从简单到复杂的几个步骤。
- 打印出你的C-String.
确认变量内容(尤其是字符串数据)的最简单方法是简单地打印到屏幕上。没有什么比看到您的 JSON 数据打印到屏幕上以确认您已正确阅读它更容易的了。
std::cout.write(bytes, filesize);
- 断点/调试器
如果您出于某种原因不打印出您的变量,则在启用调试的情况下编译您的代码,如果您使用 g++
,则加载 GDB
,如果您使用 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-String。您可以通过在字符串实例上调用 .c_str()
来访问该数据。如果您这样做,您就不必再担心调用 new
或 delete[]
,因为 std::string
class 会为您处理缓冲区。只要确保它在 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。我建议您下次 post 提出更有针对性的问题。你到底想用解析后的 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://whosebug.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';
}