基于C++简易JSON解析器
发布日期:2022-03-03 10:44:09
浏览次数:9
分类:技术文章
本文共 3992 字,大约阅读时间需要 13 分钟。
翻译自
正在开发测试中,先贴上Parser类代码。
class JsonParser { private: char COLON = ':'; public: JsonParser() {} void* parse() { CharsRange trimmedJson = CharsRange::newRange(0, jsonStr.size()).trim(); return processValue(trimmedJson); } mapprocessPlainObject(CharsRange range) { list properties = processProperties(CharsRange::newRange(range.start + 1, range.end - 1)); map objectMap; list ::iterator prop; for(prop = properties.begin() ; prop != properties.end() ; prop++) { objectMap.insert(pair (prop->name, prop->value)); } return objectMap; } list processProperties(CharsRange range) { list properties; int nameStartMark = range.start; for (int curPos = range.start; curPos < range.end; curPos++) { char ch = jsonStr.at(curPos); if (ch == COLON) { CharsRange nameToken = CharsRange::newRange(nameStartMark, curPos).trim(); int readCursor = 0; void* value = genValue(range, ++curPos, &readCursor); curPos = readCursor + 1; nameStartMark = curPos; string name = genName(nameToken); properties.push_back(Property::of(name, value)); } } return properties; } void* genValue(CharsRange range, int curPos, int *readCursor) { CharsRange valueSegment = findNextValue(CharsRange::newRange(curPos, range.end), readCursor); return processValue(valueSegment); } string genName(CharsRange nameToken) { bool hasQuote = jsonStr.at(nameToken.start) == '"' || jsonStr.at(nameToken.end) == '"'; int start = hasQuote ? nameToken.start + 1 : nameToken.start; int end = hasQuote ? nameToken.end - 1 : nameToken.end; return CharsRange::newRange(start, end).toString(); } list processArray(CharsRange range) { return processElements(CharsRange::newRange(range.start + 1, range.end - 1)); } list processElements(CharsRange range) { list objList; int elementStartMark = range.start; for (int i = range.start; i < range.end; i++) { int readCursor = 0; void * elementValue = genValue(range, elementStartMark, &readCursor); objList.push_back(elementValue); i = readCursor; elementStartMark = i + 1; } return objList; } /** * @param chars * @return value segment trimmed. */ CharsRange findNextValue(CharsRange chars, int *readCursor) { CharsRange trimChars = chars.trimLeft(); if (trimChars.relativeChar(0) == '{') { return completeSymbolPair(trimChars, readCursor, "{}"); } else if (trimChars.relativeChar(0) == '[') { return completeSymbolPair(trimChars, readCursor, "[]"); } else { int i; for (i = trimChars.start + 1; i < trimChars.end; i++) { char ch = jsonStr.at(i); if (ch == ',') { break; } } readCursor = &i; return CharsRange::newRange(trimChars.start, i).trim(); } } CharsRange completeSymbolPair(CharsRange trimChars, int *readCursor, string symbolPair) { int leftSymbol = symbolPair.at(0); int rightSymbol = symbolPair.at(1); int symbolsScore = 1; int i; CharsRange valueSegment(0,0); for (i = trimChars.start + 1; i < trimChars.end; i++) { char ch = jsonStr.at(i); if (ch == leftSymbol) { symbolsScore++; } else if (ch == rightSymbol) { symbolsScore--; } if (symbolsScore == 0) { valueSegment = CharsRange::newRange(trimChars.start, i + 1); break; } } for (; i < trimChars.end; i++) { char chx = jsonStr.at(i); if (chx == ',') { break; } } readCursor = &i; return valueSegment; } void* processValue(CharsRange valueSegment) { void* value; if (valueSegment.relativeChar(0) == '"') { string rng = CharsRange::newRange(valueSegment.start + 1, valueSegment.end - 1).toString().data(); value = &rng; } else if (valueSegment.relativeChar(0) == '{') { map obj = processPlainObject(valueSegment); value = &obj; } else if (valueSegment.relativeChar(0) == '[') { list objLst = processArray(valueSegment); value = &objLst; } else if (valueSegment.equalsString("true")) { bool ret = true; value = &ret; } else if (valueSegment.equalsString("false")) { bool ret = false; value = &ret; } else if (valueSegment.equalsString("null")) { value = NULL; } else { int ret = atoi(valueSegment.toString().data()); value = &ret; } return value; }};
转载地址:https://blog.csdn.net/yangjiegang8/article/details/104115035 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月10日 18时38分15秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
spfa、Dijkstra、Floyd算法最短路算法详解
2019-04-26
HDU4725(spfa+双端队列优化)
2019-04-26
PowerOj 2392(树状数组 or CDQ分治)
2019-04-26
HDU 6119(区间交叉问题)
2019-04-26
hdu 6143(精妙的递推)
2019-04-26
数位dp
2019-04-26
Power oj 2540 (FFT卷积)
2019-04-26
hdu 6165(dfs or bfs or tarjan+topsort)
2019-04-26
hdu 6168(stl)
2019-04-26
hdu 6170(正则表达式)
2019-04-26
排列组合 "n个球放入m个盒子m"问题 总结(转)
2019-04-26
codeforces845C(stl)
2019-04-26
图的几种存储方式(邻接矩阵+邻接表+vector)
2019-04-26
[LeetCode] 67. 二进制求和(简单模拟二进制求和)
2019-04-26
HDU1233(基础最小生成树 prim和 kruskal)
2019-04-26
终于找到可以一文多发的平台了!
2019-04-26
IntelliJ IDEA 2019 快捷键终极大全,速度收藏!
2019-04-26
第3章-5 字符转换 (15分)【python】
2019-04-26
L1-068 调和平均 (10 分)
2019-04-26