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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:12:45