我正在使用 rapid JSON 为基于 C++ 回合的 rpg 解析对象敌人,但出现了一些奇怪的错误
I'm using rapid JSON to parse an object enemy for a C++ turn based rpg and am having some strange error's
我有一些 Json 代表游戏中敌人的文件,我正在尝试访问这些文件并将其复制到 C++ 变量中。
{
"Wolf": {
"Type": 0,
"ID": 0,
"Level": 1,
"Name": "Wolf",
"Health": 100,
"Strength": 20,
"Speed": 35,
"Exp": 20,
"Defense": 30,
"Sprite": "Assets/Wolf_Sprite.png",
"Status": "Normal"
}
}
这是我代码的相关部分
#pragma once
#include <iostream>
#include "rapidjson/document.h"
#include "rapidjson/filereadstream.h"
/******************************
* The Base Values of the enemy.
*******************************/
using namespace rapidjson;
class EnemyType
{
private:
std::string Name;
std::string FileName;
int ID;
int Level;
double expGiven;
double Health;
double Speed;
double Strength;
double Defense;
Document Doc;
public:
EnemyType()
{
FILE* pFile = fopen("Assets/Enemy_List/0.json", "rb");
char buffer[65536];
FileReadStream is(pFile, buffer, sizeof(buffer));
Doc.ParseStream<0, UTF8<>, FileReadStream>(is);
assert(Doc.IsObject());
assert(Doc.HasMember("Type"));
assert(Doc.HasMember("ID"));
assert(Doc.HasMember("Level"));
assert(Doc.HasMember("Name"));
assert(Doc.HasMember("Health"));
Health = Doc["Health"].GetDouble();
}
问题是文件本身正确打开并通过了 isObject 断言,但是任何过去都会崩溃而不会失败...任何帮助将不胜感激。
来自堆栈 window ucrtbased.dll!issue_debug_notification(const wchar_t * const message) 第 125 行 C++ 非用户代码。已加载符号。
终端报错:Assertion failed: Doc.HasMember("Type"), file c:\users\timothy\documents\visual studio 2017\projects\musungo game\musungo game\enemytype.h,第 36 行
编辑:我发现答案是 .HasMember 我指定了错误的词而不是它应该是 Doc.HasMember("Class")) 而不是
the error in the terminal: Assertion failed: Doc.HasMember("Type")
此错误的原因 - Type 是 Wolf 的子代,因此它应该作为 Doc["Wolf"]["Type"] 访问并且断言应该看起来像
assert(Doc.HasMember("Wolf"));
assert(Doc["Wolf"].HasMember("Type"));
或根据用户 2350585 的建议
assert(Doc.HasMember("Wolf"));
auto Wolf = Doc["Wolf"];
assert(Wolf.HasMember("Type"));
我有一些 Json 代表游戏中敌人的文件,我正在尝试访问这些文件并将其复制到 C++ 变量中。
{
"Wolf": {
"Type": 0,
"ID": 0,
"Level": 1,
"Name": "Wolf",
"Health": 100,
"Strength": 20,
"Speed": 35,
"Exp": 20,
"Defense": 30,
"Sprite": "Assets/Wolf_Sprite.png",
"Status": "Normal"
}
}
这是我代码的相关部分
#pragma once
#include <iostream>
#include "rapidjson/document.h"
#include "rapidjson/filereadstream.h"
/******************************
* The Base Values of the enemy.
*******************************/
using namespace rapidjson;
class EnemyType
{
private:
std::string Name;
std::string FileName;
int ID;
int Level;
double expGiven;
double Health;
double Speed;
double Strength;
double Defense;
Document Doc;
public:
EnemyType()
{
FILE* pFile = fopen("Assets/Enemy_List/0.json", "rb");
char buffer[65536];
FileReadStream is(pFile, buffer, sizeof(buffer));
Doc.ParseStream<0, UTF8<>, FileReadStream>(is);
assert(Doc.IsObject());
assert(Doc.HasMember("Type"));
assert(Doc.HasMember("ID"));
assert(Doc.HasMember("Level"));
assert(Doc.HasMember("Name"));
assert(Doc.HasMember("Health"));
Health = Doc["Health"].GetDouble();
}
问题是文件本身正确打开并通过了 isObject 断言,但是任何过去都会崩溃而不会失败...任何帮助将不胜感激。
来自堆栈 window ucrtbased.dll!issue_debug_notification(const wchar_t * const message) 第 125 行 C++ 非用户代码。已加载符号。
终端报错:Assertion failed: Doc.HasMember("Type"), file c:\users\timothy\documents\visual studio 2017\projects\musungo game\musungo game\enemytype.h,第 36 行
编辑:我发现答案是 .HasMember 我指定了错误的词而不是它应该是 Doc.HasMember("Class")) 而不是
the error in the terminal: Assertion failed: Doc.HasMember("Type")
此错误的原因 - Type 是 Wolf 的子代,因此它应该作为 Doc["Wolf"]["Type"] 访问并且断言应该看起来像
assert(Doc.HasMember("Wolf"));
assert(Doc["Wolf"].HasMember("Type"));
或根据用户 2350585 的建议
assert(Doc.HasMember("Wolf"));
auto Wolf = Doc["Wolf"];
assert(Wolf.HasMember("Type"));