【问题标题】:How to validate json file in C++?如何在 C++ 中验证 json 文件?
【发布时间】:2020-04-23 12:38:50
【问题描述】:

目前我有一个 JSON 文件 (Test.json),其中包含一些 json 格式的有效数据,我正在尝试使用 JsonCpp 使用 json 对象 (readData) 解析数据,如下所示

Json::Value readData;   
std::ifstream readFile("Test.json");  
readFile >> readData; 

如果 json 文件具有 json 格式的有效内容,这可以正常工作,但如果内容不是 json 格式,它会在“readFile >> readData”处崩溃。 在将文件分配给 C++ 中的 json 对象之前,有什么方法可以验证文件?

【问题讨论】:

  • std::ifstream readFile(Test.json); 不会编译。我相信你的意思是std::ifstream readFile("Test.json");
  • 如果它崩溃,我最好的选择是不成功的读取会引发异常。尝试获取文档以进行确认或将您的 >> 包装在 try-catch 块中并尝试捕获正确的异常。
  • 你在使用JsonCpp库吗?
  • @Fureeish 确实,open-source-parsers.github.io/jsoncpp-docs/doxygen/… 说“解析错误时出现std::exception”。
  • @Azeem 是的,我正在使用 jsoncpp 库

标签: c++ json jsoncpp


【解决方案1】:

它不会“崩溃”; it throws an exception。我猜你没有发现那个异常。

无论如何,要读取 JSON,您可能希望使用 parseFromStream。这允许您设置选项,并返回truefalse。您使用的operator>> 只是一个快捷方式。

请阅读您使用的函数的文档。它可以为您提供帮助。

【讨论】:

    【解决方案2】:

    我认为您应该改用此代码。它不会使程序崩溃。它只会显示(在 STDERR 上)发生了什么错误。

    Json::Value readData;   
    std::ifstream readFile("Test.json");
    if (readFile) {
        try {
            readFile >> readData; 
        } catch (const std::exception& e) {
            std::cerr << e.what() << std::endl;
        }
    }
    else {
        std::cerr << "File not found!" << std::endl;
    }
    

    根据JsonCpp的documentationoperator&gt;&gt;()导致std::exception解析错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      相关资源
      最近更新 更多