You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:09:04