如何在C语言中使用jq实现JSON字符串有效性校验函数
修复基于jq的C语言JSON有效性校验函数
你的代码问题在于完全没处理输入的JSON字符串,只是编译了jq的表达式,这和输入的JSON是否有效毫无关系。下面是修复后的实现,附带详细说明:
问题分析
原代码的核心逻辑错误:
jq_compile_args仅用于编译jq的过滤表达式(这里的.表示原样输出输入),jv_is_valid(compiled)检查的是表达式本身是否合法,和输入JSON的有效性完全无关- 没有将输入的
input字符串解析为jq可处理的jv对象,也没有触发jq对该对象的校验流程
修复后的代码
#include <jq.h> #include <stdbool.h> bool json_is_valid(char* input) { bool is_valid = false; jq_state* state = jq_init(); if (!state) { return false; // jq初始化失败直接返回 } // 1. 将输入字符串解析为jq的jv对象 jv json_input = jv_parse(input); if (jv_get_kind(json_input) == JV_KIND_INVALID) { goto cleanup; // 解析失败,说明JSON格式无效 } // 2. 编译jq过滤表达式(. 表示原样处理输入) jv compiled = jq_compile_args(state, ".", NULL); if (!jv_is_valid(compiled)) { goto cleanup; // 表达式编译失败,理论上不会出现 } // 3. 运行jq处理输入对象,验证是否能正常执行 jq_start(state, compiled, jv_copy(json_input), 0); jv result; // 只要能拿到有效处理结果,就说明输入JSON合法 while ((result = jq_next(state))) { is_valid = true; jv_free(result); break; // 拿到结果即可,无需继续遍历 } cleanup: // 释放所有资源,避免内存泄漏 jv_free(json_input); jv_free(compiled); jq_teardown(&state); return is_valid; }
关键步骤说明
- 解析输入字符串:通过
jv_parse将输入的char*转换为jq的jv对象,若解析后类型为JV_KIND_INVALID,直接判定JSON无效 - 编译表达式:使用
.作为过滤表达式,确保jq能正常处理输入对象 - 执行校验:通过
jq_start和jq_next尝试获取处理结果,能拿到有效结果则说明输入JSON格式合法 - 资源清理:所有
jv对象和jq状态必须手动释放,避免内存泄漏
注意:编译时需要链接jq库(添加-ljq编译参数),且系统需安装jq开发库(如libjq-dev)。
内容的提问来源于stack exchange,提问作者MaxBrandtner
相关产品推荐
相关产品推荐

