C中的CCAN JSON序列化
我在用图书馆。它非常轻巧且易于理解,但我对json_解码有一个问题。我正在从文件中读取数据(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
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;
}