我正在修改一个游戏中的多个json文件,希望能够使用外部应用程序进行处理。
据我所知,此代码在规范范围内,但出现运行时错误:
terminate called after throwing an instance of 'nlohmann::detail::type_error'
what(): [json.exception.type_error.304] cannot use at() with string
这是重现该错误的剥离代码:
#include "json.hpp"
using json = nlohmann::json;
using namespace std;
namespace ns
{
class info
{
public:
std::string id;
};
void to_json(json& j, const info& mi);
void from_json(const json& j, info& mi);
}
int main()
{
json j ="[{\"id\": \"identifier\"}]";
ns::info info = j;
return 0;
}
void ns::to_json(json& j, const ns::info& mi)
{
j = json{
{"id",mi.id},
};
}
void ns::from_json(const json& j, ns::info& mi)
{
mi.id = j.at("id").get<std::string>();
}
这是编译器的输出:
-------------- Build: Debug in jsontest (compiler: GNU GCC Compiler)---------------
mingw32-g++.exe -Wall -std=c++11 -fexceptions -g -c C:\Users\UserOne\Documents\c++\jsontest\main.cpp -o obj\Debug\main.o
mingw32-g++.exe -o bin\Debug\jsontest.exe obj\Debug\main.o
Output file is bin\Debug\jsontest.exe with size 2.82 MB
Process terminated with status 0 (0 minute(s), 3 second(s))
0 error(s), 0 warning(s) (0 minute(s), 3 second(s))
答案 0 :(得分:0)
有两个问题:
json j = "...";
使用JSON string 值初始化j。它不会尝试解析内容。为此,您需要将其设置为json文字:json j = "..."_json;
修复此问题后,您拥有一个JSON array ,但是您尝试访问ns::from_json()
中JSON object 的字段。
因此,请同时解决这两个问题:
json j ="{\"id\": \"identifier\"}"_json;
它将起作用。
您还可以考虑使用原始字符串来避免转义所有引号:
json j = R"({"id": "identifier"})"_json;
或仅使用初始化列表而不是解析json字符串:
json j = { {"id", "identifier" } };
如果您的源是作为函数参数或任何其他形式提供的字符串,而不是编译时已知的文字:
std::string s = R"({"id": "identifier"})";
json j = json::parse(s);