2014-02-26 3 views
1

나는 JSON 라이브러리를 사용하고 있습니다. 꽤 가볍고 이해하기 쉽지만 json_decode에는 한 가지 문제가 있습니다. 나는 파일 (JSON) 데이터를 읽고 있어요 : 같은 텍스트를CCAN JSON C에서 직렬화

[ 
     { 
       "MBV": 0, 
       "CRRC": 0, 
       "LFrei": 0 
     }     
] 

있다 inbuffer 그래서 나는 변수 JsonNode을 가지고 그것을 해독하려고, 다음과 같은

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'); 

내 파일보기

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 형식의 파일을 읽지 않으려한다고 말할 수 있습니까?

답변

1

사용중인 JSON 라이브러리를 알지 못하지만 inbuffer이 (가) 올바르게 NUL 종료되지 않았기 때문에 오류가 발생했다고 생각됩니다. 파일의 끝에서 getc()inbuffer에 복사 할 EOF (-1)를 반환하기 전에 feof()이 TRUE를 반환합니다. 내가 할 것 :

while((ch = getc(instream)) != EOF) { 
    inbuffer[count] = ch; 
    count++; 
} 
inbuffer[count] = '\0'; 

또는 사용 fread() :

count = fread(inbuffer, 1, sizeof(inbuffer) - 1, stream); 
inbuffer[count] = '\0'; 
1

이 코드를 인쇄 배열의 첫 번째 개체에있는 모든 키 - 값 쌍을 (당신의 예제는 하나의 객체를 포함하는 배열을 보여줍니다 차례로 이는) 세 가지 키 - 값 항목이 포함

#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; 
} 

은 고려 난 그냥 크게 한 순회 당신이 PA하려는 JSON의 구조에 따라 달라집니다 rse. 귀하의 필요에 맞는다면 좋겠지 만 좀 더 일반적인 해결책을 찾아야 할 것입니다. 라이브러리에 포함 된 json.h 헤더 파일을 살펴보면 JSON 구조가 파일에서 디코딩 된 메모리에 어떻게 저장되는지 이해할 수 있습니다.

개인적인 경험으로도 JSON-C 라이브러리가이 라이브러리보다 훨씬 사용하기 쉽습니다.