基本上,我希望在c中有一个函数bool json_is_valid(char* input).因为我将jq用于我的json程序的其余部分,所以我也想使用它来做这件事,但是我找不到一个正确的方法来实现它.在其他事情中,我try 了以下几种方法:

bool json_is_valid(char* input){
        jq_state* state = jq_init();
        jv compiled = jq_compile_args(state, ".", NULL);

        return !(jv_is_valid(compiled));
}

然而,这仍然不起作用.这怎么可能被修复呢?

推荐答案

据我所知,jv_parse可以用来验证JSON的字符串.

它在src/jv.h年宣布为:

jv jv_parse(const char* string);

将此函数的结果传递给jv_is_valid似乎可以完成工作.src/jv.h中将jv_is_valid定义为:

static int jv_is_valid(jv x) {
    return jv_get_kind(x) != JV_KIND_INVALID;
}

下面是一个粗略的例子:

#include <jq.h>
#include <stdio.h>
#include <string.h>

int json_is_valid(const char *json)
{
    jv ele = jv_parse(json);
    int valid = jv_is_valid(ele);
    jv_free(ele);

    return valid;
}

int main(void)
{
    while (1) {
        char buf[512];

        if (!fgets(buf, sizeof buf, stdin))
            break;

        buf[strcspn(buf, "\n")] = '\0';

        printf("<<%s>> Valid? %s.\n", buf, json_is_valid(buf) ? "Yes" : "No");
    }
}
{}
<<{}>> Valid? Yes.
[]
<<[]>> Valid? Yes.
[{}]
<<[{}]>> Valid? Yes.
[][]
<<[][]>> Valid? No.
"foo"
<<"foo">> Valid? Yes.
"foo":"bar"
<<"foo":"bar">> Valid? No.
51
<<51>> Valid? Yes.
{42: []}
<<{42: []}>> Valid? No.
{"42":[1, 2, 3]}
<<{"42":[1, 2, 3]}>> Valid? Yes.
'qux'
<<'qux'>> Valid? No.

jq_compile(jq_compile_args)的问题在于,它似乎解析了the manual中描述的jq过滤语言.

也许有一种更正确的方法,但lack of a proper C API documentation使这一问题成为一个难以研究的问题.

C++相关问答推荐

位屏蔽对于无符号转换是强制的吗?

有效地计算由一组点构成的等边三角形和等腰三角形的数量

编译的时候g++通常会比GCC慢很多吗?

C是否用0填充多维数组的其余部分?

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

如何在C中使printf不刷新标准输出?

进程在写入管道时挂起

GTK函数调用将完全不相关的char* 值搞乱

条件跳转或移动取决于未初始化值(S)/未初始化值由堆分配创建(Realloc)

如何使这个While循环在新行上结束

错误:字符串在C中获得意外输出

C++中PUTS函数的返回值

为什么会出现此错误?二进制表达式的操作数无效

强制GCC始终加载常量(即只读),即使启用了优化

UpDown控制与预期相反

从系统派生线程调用CRT

C 程序不显示任何输出,但它接受 CS50 Lab1 的输入问题

在 C/C++ 中原子按位与字节的最佳方法?

在 C23 之前如何对空指针使用nullptr?

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?