水群的时候看到有人在说bat读json数据,突然就想写一个json解析的bat第三方。。。
json语法比较简单,于是就用有限状态机来实现了。
下面是转换效果(左边是json数据,右边是转换为bat命令的结果):
顺便实现了语法错误提示:
下面是实现代码:
/*
jsoner
Version : 1.0
Auther : blackkitty
Date : 2017-3-14
Description : JSON parsing for batch
batch usage:
jsoner [-f JSONFile]|[-s JSONString] SaveFile elementName
call SaveFile
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MATCHED(c,s) (strchr(s,c)!=NULL) /* judge if c is in s */
#define IS_WHITESPACE(c) (MATCHED(c," \t\n")) /* judge if c is a whitespace */
#define IS_KEYCHAR(c) (MATCHED(c,"{}[],:\0")) /* judge if c is a json key character */
enum ContentType {STRING_TYPE, NUMBER_TYPE, BOOL_TYPE, NULL_TYPE, BAD_TYPE};
enum ErrorType{SUCCESS = 0, BAD_CONTENT_TYPE, WRONG_CHARACTER, NO_MATCH, INCOMPLETE};
class ValueName{
public:
char key[4096];
ValueName(){
stk = _stk;
*stk = 0;
memset(key,0,sizeof(key));
}
ValueName push(const char * str){
int t = 0;
tail = key+*stk;
for(;*str != '\0';t++)
*tail++ = *str++;
*tail = '\0';
stk[1] = *stk + t;
stk++;
return *this;
}
ValueName pop(){
stk--;
key[*stk] = '\0';
return *this;
}
private:
int _stk[4096];
int *stk;
char *tail;
};
struct EC{
ErrorType et;
const char * pos;
EC(ErrorType _et, const char * _pos):et(_et), pos(_pos){}
};
bool isNumber(const char *str);
bool matchStr(const char *str1, const char *str2);
ContentType typeCheck(const char *str, ErrorType & et);
char * loadJsonFile(const char * filepath);
char * getContent(const char * str, int & ctSize, ErrorType & et);
char * getIndex(int inx);
void whitespaceCLR(char *str);
int itoa(int x, char *buffer);
const char * _ErrorType[] = {
"Success.",
"Unexpected charater or data type.",
"There should not be a '%c'.&