在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
这篇文章的灵感来自一个正在进行的项目。 我正在构建一个需要比较两个Json对象的服务。 问题是我需要能够替换键 , 过滤出路径并将比较功能应用于特定节点。 显然,标准库比较功能(例如 解决方案是在Json对象的基础上构建AST ( 抽象语法树 )。 树中的每个 通过这样做,我将具有灵活性,可以更轻松地将算法应用于数据。 为了构建它,我们将从Lexer开始以生成令牌 。 然后转到解析器 ,它将获取令牌并将其与Json语法匹配。 最后,我们将添加AST挂钩来生成树。 最终目录结构: . 如果要查看并运行最终结果: cd $GOPATH/src/github.com/Lebonesco Lexer 词法分析器的工作是获取json数据并将其转换为 注意:词法分析器也称为扫描仪。 让我们从????开始 cd $GOPATH/src/github.com/Lebonesco/json_parser 您可以自由定义 注意:我们将使用 接下来,让我们进入我们的 mkdir lexer 在功能方面,它将需要能够创建一个新 注意:此扫描仪不支持布尔值,但可以轻松添加它们。 Lexer测试在这里,我们将接收一个子字符串,并确保它输出正确的令牌流。 要运行测试: go test -v 您现在有一个工作的词法分析器 解析器这是我们获取流并将其与json语法匹配以生成AST节点的部分。 如果我们要用正则表达式定义json ,它将由下面定义的语法表示 JSON : value 在以上语法中, 如果您提供正则表达式,则有类似 但是由于Json非常简单,我们将手工完成! ???? 让我们构造代表最终结果的AST mkdir ast 注意:因为Go使用 现在进入解析器! 让我们将它们放在一起并编写驱动程序 注意: 跑步: go run main.go ./exampes/test.json 全部完成???? 现在我们可以生成AST,可以轻松地向每个节点添加滚动哈希并执行所有其他自定义操作,例如:
我将那些扩展留给读者。 随意在评论中删除指向您工作的链接。 我很想看看你的想法。 ???? 感谢您抽出宝贵的时间阅读本文。 如果您觉得它有用或有趣,请告诉我me。 From: https://hackernoon.com/create-a-go-json-parser-batteries-included-9d02d09fe508 |
请发表评论