json-rpc配置文件常非标准json,需先校验格式、过滤注释、替换环境变量;用nlohmann::json解析时应使用at()访问、is_*()校验类型;注意windows下utf-8 bom和编码问题;无统一字段标准,须依实际结构读取。

JSON-RPC配置文件通常不是标准JSON,先确认格式是否合法
很多所谓“JSON-RPC配置文件”其实是 jsonrpc.conf 或 config.json 这类名字的文本,但内容可能混入注释、环境变量占位符(如 ${PORT})、甚至 TOML/YAML 风格语法。C++ 标准库不解析 JSON,更不处理非标准扩展。直接用 std::ifstream 读取后丢给 nlohmann::json::parse() 会崩在第一行注释上。
实操建议:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 用
file命令或head -n 5 config.json看开头几行,确认是否真为纯 JSON(无//、#、%%等) - 若含注释,先用正则或逐行过滤(跳过以
//、#开头的行,注意引号内注释不算)再 parse - 若含环境变量,得先调用
std::getenv()替换,比如把"port": ${RPC_PORT}换成"port": 8545(注意加引号与否)
用 nlohmann/json 读取并提取 RPC 字段要小心类型转换
nlohmann::json 解析后是松散类型,字段缺失或类型错会导致运行时异常(如 json.exception.out_of_range.403)。不能假设 config["rpc"]["host"] 一定存在且是字符串。
实操建议:
- 用
at()而非[]访问嵌套字段,它会在键不存在时抛out_of_range,比静默返回 null 更易调试 - 用
is_string()/is_number_integer()先校验类型,再用get<:string>()</:string>强转 - 端口号常见坑:配置里写
"port": "8545"(字符串)或"port": 8545(数字),C++ 里统一转成int时得分别处理
auto config = nlohmann::json::parse(json_str);
std::string host = config.at("rpc").at("host").get<:string>();
int port = config.at("rpc").at("port").is_string()
? std::stoi(config.at("rpc").at("port").get<:string>())
: config.at("rpc").at("port").get<int>();
</int></:string></:string>
Windows 下路径和编码问题比 Linux 更容易出错
Windows 默认 ANSI 编码(如 GBK),而 JSON 规范要求 UTF-8。若配置文件用记事本另存为 UTF-8(带 BOM),nlohmann::json::parse() 会因 BOM 头报 parse_error.101;若用 UTF-8(无 BOM)但文件实际是 GBK,则中文字段全乱码,get<:string>()</:string> 返回空或异常字节。
实操建议:
- 用
notepad++或 VS Code 打开配置文件,右下角确认编码是UTF-8(不含 BOM) - C++ 读取时用二进制模式打开,手动跳过 BOM:
if (buf[0]==0xEF && buf[1]==0xBB && buf[2]==0xBF) pos += 3; - 避免用
std::wifstream,nlohmann/json 不支持 wide string 输入
没有“JSON-RPC 配置文件标准”,别硬套 rpc-server 的字段名
不同项目对 “JSON-RPC 配置” 定义完全不同:Geth 用 http.port,Parity 用 rpc.port,自研服务可能叫 server.bind。不存在通用 schema,jsonrpc 这个词只是说明用途,不是结构前缀。
实操建议:
- 别写死
config["jsonrpc"]["endpoint"],先dump()整个解析结果看实际键名 - 若需兼容多个项目,用 map
注册字段处理器,比如 handlers["http.port"] = [](const json& j){ return j.get<int>(); };</int> - 字段值可能是数组(如
"allowed_origins": ["*"]),访问前用is_array()判断,别直接at(0)
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










