使用μC/ OS-II的Strightforward解析json

使用μC/ OS-II的Strightforward解析json

问题描述:

任何人都可以帮助编写一个C解析器(使用Codewarrior)来解析下面的文件吗?我尝试了很多C语言json解析器,但不幸的是没有得到这个想法,或者他们很难。使用μC/ OS-II的Strightforward解析json

[ 
[0,"Door1","Door1Drv","Calculator","Alarm"], 
[1,"Door3","Door3Drv","Calculator","Alarm"], 
[2,"Door2","Door2Drv","Calculator","Alarm"]] 
+0

到目前为止您尝试了哪些解析器?你见过[JSMN](http://zserge.com/jsmn.html)吗? – vasek

+0

请向我们展示您以前的努力。无论是与解析器或直接自己的实现。 – Gerhardh

+0

如果您要求推荐,那么这是OT,或者如果您期待解决方案,那么它太宽泛;无论哪种方式,你不清楚你的期望,所以有三个理由已经关闭! RTOS和工具链的细节在很大程度上是不合适的;精确的要求和限制的细节被遗漏。也不知道你已经尝试了什么,或者为什么它不令人满意。 – Clifford

要预先申请,建议使用Frozen。如果您的应用程序具有如上所示的修复数据格式,请参阅下面的参考资料。

很基本的版本看起来象下面这样:

#include <stdio.h> 

#define MAX_PRAM 4 

struct param_t { 
    int id; 

    // FIXME: use pointer & malloc to allocate if possible 
    char data[MAX_PRAM][30]; 
}; 

static int parse(const char *buff, int start, const int end, 
    struct param_t *out) 
{ 
    char *ptr = out->data[0]; 
    int state = 0; 
    int index = 0; 
    int param_index = 0; 

    printf("\t> parse next record<%d:%d>\n", start, end); 
    while((start < end) && (param_index < MAX_PRAM)) { 
     char ch = buff[start]; 

     // printf("\t> state: %d, char '%c'\n", state, ch); 
     switch (state) { 
      case 0: // searching for start point 
       if ((ch >= '0') && (ch <= '9')) { 
        out->id = ch - '0'; 
        state++; 
       } 

       break; 

      case 1: // parse number 
       if ((ch < '0') || (ch > '9')) { 
        printf ("\t> number %d\n", out->id); 

        state++; 
        if (ch == '"') 
         state++; 
       } else 
        out->id = (out->id * 10) + (ch - '0'); 
       break; 

      case 2: // search string 
       if (ch == '"') { 
        index = 0; 
        state++; 
       } 

       break; 

      case 3: // get string 
       if (ch == '"') { // finish one string, parse next one if need 
        ptr[index] = '\0'; 

        printf ("\t> string '%s', length %d\n", 
         out->data[param_index], index); 

        param_index++; 
        ptr = out->data[param_index]; 
        state--; 
       } else 
        ptr[index++] = ch; 

       break; 

      default: // EOS - exit 
       break; 
     } 

     start++; 
    } 

    return (param_index >= 4) ? start : 0; 
} 

// 
// main entry 
// 
int main(int argc, char *argv[]) { 
    int file = open("test.txt", 0 /* 0 ~ O_RDONLY in fcntl.h */); 

    if (file) { 
     char buff[1024] = { 0 }; 
     struct param_t param = { 0 }; 
     int len = read(file, buff, 1024); 
     int pos = 0; 

     while((pos = parse(buff, pos, len, &param)) > 0) { 
      printf ("\t%d\n", param.id); 

      printf("[%4d] %d - %-10s | %-10s | %-15s | %-10s \n", 
       pos, param.id, param.data[0], param.data[1], param.data[2], 
       param.data[3]); 
     } 

     close(file); 
    } 
} 

随着输入:

[[10,"Door0", 

"Door0Drv","Calculator0","Alarm0"], 

[15,"Door1","Door1Drv","Calculator1","Alarm1"], 

[230,"Door2","Door2Drv","Calculator2", 
    "Alarm2"]] 

输出的样子:

 > number 10 
     > string 'Door0', length 5 
     > string 'Door0Drv', length 8 
     > string 'Calculator0', length 11 
     > string 'Alarm0', length 6 
     10 
[ 49] 10 - Door0  | Door0Drv | Calculator0  | Alarm0 
     > number 15 
     > string 'Door1', length 5 
     > string 'Door1Drv', length 8 
     > string 'Calculator1', length 11 
     > string 'Alarm1', length 6 
     15 
[ 100] 15 - Door1  | Door1Drv | Calculator1  | Alarm1 
     > number 230 
     > string 'Door2', length 5 
     > string 'Door2Drv', length 8 
     > string 'Calculator2', length 11 
     > string 'Alarm2', length 6 
     230 
[ 158] 230 - Door2  | Door2Drv | Calculator2  | Alarm2 

随意定制。

+0

这是很有用的@sdao。 你可以帮助,如果它是动态的,实际上我看过很多json解析器和比较,但我没有得到的重点呢。 - Codewarrior不识别fopen关键字。 FILE * file = fopen(“test.txt”,“r”); – MhdBanat

+0

改为使用打开/读取/关闭系统调用。 – sdao