【记录】c++实现json格式解析与转换

水群的时候看到有人在说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'.&
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值