nlohmann json版本3.2.0,运行时错误

时间:2018-08-29 03:17:55

标签: json c++11

我正在修改一个游戏中的多个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))

1 个答案:

答案 0 :(得分:0)

有两个问题:

  1. json j = "...";使用JSON string 值初始化j。它不会尝试解析内容。为此,您需要将其设置为json文字:json j = "..."_json;

  2. 修复此问题后,您拥有一个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);