C中的CCAN JSON序列化

C中的CCAN JSON序列化,c,json,file,C,Json,File,我在用图书馆。它非常轻巧且易于理解,但我对json_解码有一个问题。我正在从文件中读取数据(JSON): FILE *instream = fopen("/tmp/file.dat", "r"); char ch; int count = 0; do { ch = getc(instream); inbuffer[count] = ch; count++; } while (!feof(instream) && ch != '\0'); 我的文件如下所示,因此i

我在用图书馆。它非常轻巧且易于理解,但我对json_解码有一个问题。我正在从文件中读取数据(JSON):

FILE *instream = fopen("/tmp/file.dat", "r");
char ch;
int count = 0;
do {
    ch = getc(instream);
    inbuffer[count] = ch;
count++;
} while (!feof(instream) && ch != '\0');
我的文件如下所示,因此inbuffer具有相同的文本

[
        {
                "MBV": 0,
                "CRRC": 0,
                "LFrei": 0
        }                
]
我试着将其解码为JsonNode变量

static char *chomp(char *s) //function taken from CCAN JSON example
{
    char *e;
    if (s == NULL || *s == 0)
        return s;

    e = strchr(s, 0);
    if (e[-1] == '\n')
        *--e = 0;
    return s;
}

const char *s = chomp(inbuffer);
JsonNode *jin = json_decode(s);
printf("JSON: %s\n", jin);
运行程序后,我得到

JSON: (null)

有人能告诉我为什么json_decode函数不想读取json格式的文件,即使文件是使用此库创建的?

我不知道您正在使用的json库,但我怀疑发生错误是因为
inbuffer
没有正确地NUL终止。在文件末尾,
getc()
返回您在
feof()之前复制到
inbuffer
中的EOF(-1)。我会:

while( (ch = getc( instream )) != EOF ) {
   inbuffer[count] = ch;
   count++;
}
inbuffer[count] = '\0';
或者只需使用
fread()


我不知道您正在使用的JSON库,但我怀疑发生错误是因为
inbuffer
没有正确地以NUL结尾。在文件末尾,
getc()
返回您在
feof()之前复制到
inbuffer
中的EOF(-1)。我会:

while( (ch = getc( instream )) != EOF ) {
   inbuffer[count] = ch;
   count++;
}
inbuffer[count] = '\0';
或者只需使用
fread()


此代码打印在数组的第一个对象中找到的所有键值对(您的示例显示了一个仅包含一个对象的数组,该数组又包含三个键值项):

#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
文件*fd;
长文件大小;
字符*缓冲区;
JsonNode*jin,*node;
如果((fd=fopen(argv[1],“r”)==NULL){
perror(“打开文件时出错”);
返回退出失败;
}
fseek(fd,0,SEEK_END);
filesize=ftell(fd);
倒带(fd);
buffer=(char*)malloc(sizeof(char)*filesize+1);
if(fread(buffer,sizeof(char),filesize,fd)!=filesize){
fprintf(stderr,“读取文件时出错”);
返回退出失败;
}
缓冲区[文件大小]='\0';
jin=json_解码(缓冲区);
json_foreach(节点,jin->children.head)
printf(“%s:%g\n”,节点->键,节点->编号);
自由(缓冲);
返回退出成功;
}
考虑到我刚才所做的遍历在很大程度上取决于您试图解析的JSON的结构。如果它符合你的需要,很好,但也许你需要找到一个更通用的解决方案。查看库中包含的
json.h
头文件,了解从该文件解码后json结构如何存储在内存中


另外,根据我个人的经验,我发现这个库比这个库更容易使用。

这段代码打印在数组的第一个对象中找到的所有键值对(您的示例显示了一个只包含一个对象的数组,该数组又包含三个键值项):

#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
文件*fd;
长文件大小;
字符*缓冲区;
JsonNode*jin,*node;
如果((fd=fopen(argv[1],“r”)==NULL){
perror(“打开文件时出错”);
返回退出失败;
}
fseek(fd,0,SEEK_END);
filesize=ftell(fd);
倒带(fd);
buffer=(char*)malloc(sizeof(char)*filesize+1);
if(fread(buffer,sizeof(char),filesize,fd)!=filesize){
fprintf(stderr,“读取文件时出错”);
返回退出失败;
}
缓冲区[文件大小]='\0';
jin=json_解码(缓冲区);
json_foreach(节点,jin->children.head)
printf(“%s:%g\n”,节点->键,节点->编号);
自由(缓冲);
返回退出成功;
}
考虑到我刚才所做的遍历在很大程度上取决于您试图解析的JSON的结构。如果它符合你的需要,很好,但也许你需要找到一个更通用的解决方案。查看库中包含的
json.h
头文件,了解从该文件解码后json结构如何存储在内存中

另外,根据我个人的经验,我发现这个库比这个库更容易使用

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ccan/json/json.h>

int main(int argc, char **argv)
{
    FILE *fd;
    long filesize;
    char *buffer;
    JsonNode *jin, *node;

    if ((fd = fopen(argv[1], "r")) == NULL) {
        perror("Error opening file");
        return EXIT_FAILURE;
    }

    fseek(fd, 0, SEEK_END);
    filesize = ftell(fd);
    rewind(fd);

    buffer = (char *) malloc(sizeof(char) * filesize+1);

    if (fread(buffer, sizeof(char), filesize, fd) != filesize) {
        fprintf(stderr, "Error reading file\n");
        return EXIT_FAILURE;
    }

    buffer[filesize] = '\0';

    jin = json_decode(buffer);
    json_foreach(node, jin->children.head)
        printf("%s: %g\n", node->key, node->number_);

    free(buffer);

    return EXIT_SUCCESS;
}