使用JsonCpp读取JSON文件时提示第1行第1列语法错误如何解决
问题排查步骤与解决方案
这个报错的核心原因是JsonCPP解析器读取到的第一字节不是合法JSON内容的起始字符,按以下优先级排查即可:
1. 优先确认文件路径正确性
你当前的代码没有做文件打开成功的校验,90%以上的同类报错都是程序运行时的工作目录下不存在config.json文件,实际打开了空文件。
首先在打开文件后增加校验逻辑:
std::ifstream config_file("config.json", std::ifstream::binary); // 新增校验逻辑 if (!config_file.is_open()) { std::cout << "配置文件打开失败,请检查当前工作路径是否正确" << std::endl; // 可以打印当前工作路径确认位置,Linux/macOS用getcwd,Windows用GetCurrentDirectory return 1; }
2. 检查JSON文件是否带UTF-8 BOM头
如果你是用Windows记事本保存的config.json,默认会在文件开头增加3字节的BOM头(十六进制为EF BB BF),这个头不属于JSON语法的合法内容,会被解析器识别为非法字符。
解决方法:用VS Code、Sublime Text等编辑器打开文件,将编码格式修改为UTF-8 无BOM后重新保存即可。
3. 改用更稳定的解析逻辑规避流兼容问题
部分旧版本JsonCPP的>>流重载存在兼容性问题,你可以先把文件内容全部读取到字符串中,再用Json::Reader显式解析,同时可以捕获更详细的错误信息:
#include <fstream> #include <json/json.h> #include <iostream> #include <sstream> int main() { std::ifstream config_file("config.json", std::ifstream::binary); if (!config_file.is_open()) { std::cout << "配置文件打开失败" << std::endl; return 1; } // 读取全部内容到字符串 std::stringstream buffer; buffer << config_file.rdbuf(); std::string content = buffer.str(); // 可以先打印原始内容确认读取是否正确 // std::cout << "读取到的文件内容:" << content << std::endl; Json::Value config; Json::Reader reader; if (!reader.parse(content, config)) { std::cout << "解析失败,错误信息:" << reader.getFormattedErrorMessages() << std::endl; return 1; } std::cout << config["key1"] << std::endl; return 0; }
4. 检查文件是否有不可见前缀字符
如果以上步骤都没有解决问题,用十六进制编辑器打开config.json,确认文件开头没有多余的空格、换行、或者其他不可见控制字符。
内容的提问来源于stack exchange,提问作者vectar
相关产品推荐
相关产品推荐

