3. 数值解析

发布时间 2023-08-08 11:47:55作者: 明天咪西什么

3. 数值解析

先来设计函数声明, 就第二节说的: static int __parse_json_number(const char* cursor, const char** end, double* num)

解析数值的步骤很简单, 我们可以直接调用标准库中的double strtod(const char *nptr, char **endptr);​进行处理, 返回值double刚好就是我们想要的.

但是在调用这个函数之前需要进行一系列的判断, 因为JSON标准对数值有一定的要求.

直接上代码

static int __parse_json_number(const char *cursor, const char **end, double *num)
{
    const char *p = cursor;
    if (*p == '-')
    {
        p++;
    }

    if (*p == '0' && (isdigit(p[1]) || p[1] == 'X' || p[1] == 'x'))
    {
        return -2;
    }

    *num = strtod(cursor, (char **)end);
    if (cursor == *end)
    {
        return -2;
    }

    return 0;
}

首先第一个字符如果是负号-​, ++继续判断下一个字符

当前字符为'0'​, 且

  1. 下一个字符为十进制数, 表示当前数值为八进制, 不允许, 返回错误.
  2. 下一个字符为X或x, 表示当前数值为十六进制, 不允许, 返回错误.

最后将cursor直接转为double, 如果转换失败, 则返回错误, 成功则退出.

参考

[1] Workflow 源码解析 Json parser :part1 parse - 知乎 (zhihu.com)