test_parse_root_not_singular函数中关于数字的测试
请教一下为什么将test_parse_root_not_singular函数中“0123”``“0x0”``“0x123” 的测试返回结果算LEPT_PARSE_ROOT_NOT_SINGULAR,而不是算LEPT_PARSE_INVALID_VALUE?
因为解析数字时,只会考虑能解析多少合符语法的字符,因此 "0123" 只解析了第一个字符 '0',转换成 0.0。这个设计的好处是,如果要实现像 RapidJSON 的 kParseStopWhenDoneFlag 这种功能时,"0123" 可能是两个 JSON "0" 和 "123" 串接起来,可以通过两次解析来得出 0.0 和 123.0。我认为解析一个 JSON 类型时,应该尽量解析正确的字符,之后的就交给上级处理。
考虑的好周到,我也加油实现一下吧!
请教一下 测试用例"1."被归类于LEPT_PARSE_INVALID_VALUE而不是LEPT_PARSE_ROOT_NOT_SINGULAR,这是否也是因为“尽量解析正确的字符”? 如果是的话,"1.6e"也属于LEPT_PARSE_INVALID_VALUE? 而"1.12."和“3.2k”则属于LEPT_PARSE_ROOT_NOT_SINGULAR?
还有一个细节容易忽视,
int lept_parse(lept_value* v, const char* json) {
lept_context c;
int ret;
assert(v != NULL);
c.json = json;
v->type = LEPT_NULL;
lept_parse_whitespace(&c);
if ((ret = lept_parse_value(&c, v)) == LEPT_PARSE_OK) {
lept_parse_whitespace(&c);
if (*c.json != '\0') {
v->type = LEPT_NULL;
ret = LEPT_PARSE_ROOT_NOT_SINGULAR;
}
}
return ret;
}
tutorial2 中检测“0123”“0x0”“0x123”,
if(*c.json!='\0')
v->type=LEPT_NULL;
和tutorial1 不一样,容易忽视
叶神叶神v->n = strtod(c->json, NULL);解析出来是123啊 不应该是0吗
@ganjiu11 在 strtod() 之前要先检查是否合符 JSON 的文法。