json-tutorial icon indicating copy to clipboard operation
json-tutorial copied to clipboard

test_parse_root_not_singular函数中关于数字的测试

Open lightjiao opened this issue 9 years ago • 6 comments

请教一下为什么将test_parse_root_not_singular函数中“0123”``“0x0”``“0x123” 的测试返回结果算LEPT_PARSE_ROOT_NOT_SINGULAR,而不是算LEPT_PARSE_INVALID_VALUE?

lightjiao avatar Sep 19 '16 17:09 lightjiao

因为解析数字时,只会考虑能解析多少合符语法的字符,因此 "0123" 只解析了第一个字符 '0',转换成 0.0。这个设计的好处是,如果要实现像 RapidJSON 的 kParseStopWhenDoneFlag 这种功能时,"0123" 可能是两个 JSON "0""123" 串接起来,可以通过两次解析来得出 0.0123.0。我认为解析一个 JSON 类型时,应该尽量解析正确的字符,之后的就交给上级处理。

miloyip avatar Sep 19 '16 17:09 miloyip

考虑的好周到,我也加油实现一下吧!

lightjiao avatar Sep 20 '16 06:09 lightjiao

请教一下 测试用例"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?

Cozak avatar Dec 03 '17 12:12 Cozak

还有一个细节容易忽视,

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 不一样,容易忽视

skywhat avatar Dec 13 '17 06:12 skywhat

叶神叶神v->n = strtod(c->json, NULL);解析出来是123啊 不应该是0吗

ganjiu11 avatar Jul 30 '18 10:07 ganjiu11

@ganjiu11 在 strtod() 之前要先检查是否合符 JSON 的文法。

miloyip avatar Jul 30 '18 11:07 miloyip