我们将整数和浮点数解析为单独的类型,这允许我们支持[-9223372036854775808,9223372036854775808]中的大型64位整数,如Java long 或C / C ++ long long 。在区分整数和浮点数的解析器中,并非所有解析器都支持64位整数。(例如,sajson拒绝整数大于或等于2147483648的JSON文件.FreeJSON将解析包含过长整数的文件,如18446744073709551616作为浮点数)当我们无法将整数表示为带符号的64位时值,我们拒绝JSON文档。
在解析过程中进行完整的UTF-8验证(像fastjson,gason和dropbox json11这样的解析器不会进行UTF-8验证);完全验证了这些数字(像gason和ultranjson这样的解析器将接受 [0e+] 为有效的JSON);验证未转义字符的字符串内容(像fastjson和ultrajson这样的解析器接受未转义的换行符和字符串中的标签)。
Architecture
解析器分两个阶段工作:
阶段1.(查找标记)快速标识结构元素,字符串等。我们在那个阶段验证UTF-8编码。
阶段2.(结构构建)涉及构建排序的“树”(具体化为磁带)以浏览数据。在此阶段解析字符串和数字。
导航已解析的文档
以下是将解析后的JSON转储回字符串的代码示例:
- ParsedJson::iterator pjh(pj);
- if (!pjh.isOk()) {
- std::cerr << " Could not iterate parsed result. " << std::endl;
- return EXIT_FAILURE;
- }
- compute_dump(pj);
- //
- // where compute_dump is :
-
- void compute_dump(ParsedJson::iterator &pjh) {
- if (pjh.is_object()) {
- std::cout << "{";
- if (pjh.down()) {
- pjh.print(std::cout); // must be a string
- std::cout << ":";
- pjh.next();
- compute_dump(pjh); // let us recurse
- while (pjh.next()) {
- std::cout << ",";
- pjh.print(std::cout);
- std::cout << ":";
- pjh.next();
- compute_dump(pjh); // let us recurse
- }
- pjh.up();
- }
- std::cout << "}";
- } else if (pjh.is_array()) {
- std::cout << "[";
- if (pjh.down()) {
- compute_dump(pjh); // let us recurse
- while (pjh.next()) {
- std::cout << ",";
- compute_dump(pjh); // let us recurse
- }
- pjh.up();
- }
- std::cout << "]";
- } else {
- pjh.print(std::cout); // just print the lone value
- }
- }
(编辑:ASP站长网)
|