| 
                         我们将整数和浮点数解析为单独的类型,这允许我们支持[-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 
 -   } 
 - } 
 
                          (编辑:91站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |