精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用面向對象的方式操作 JSON 甚至還能做四則運算 JSON 庫

開發 前端
至此算是我第一次利用編譯原理的知識解決了一點特定領域問題,在大學以及工作這些年一直覺得編譯原理比較高深,所以內心一直是抗拒的,但經過這段時間的學習和實踐慢慢的也掌握到了一點門道。

前言

在之前實現的 JSON 解析器?中當時只實現了將一個 JSON 字符串轉換為一個 JSONObject?,并沒有將其映射為一個具體的 struct?;如果想要獲取值就需要先做斷言將其轉換為 map 或者是切片再來獲,會比較麻煩。

decode, err := gjson.Decode(`{"glossary":{"title":"example glossary","age":1}}`)
assert.Nil(t, err)
glossary := v["glossary"].(map[string]interface{})
assert.Equal(t, glossary["title"], "example glossary")
assert.Equal(t, glossary["age"], 1)

但其實轉念一想,部分場景我們甚至我們只需要拿到 JSON? 中的某個字段的值,這樣還需要先聲明一個 struct 會略顯麻煩。

經過查詢發現已經有了一個類似的庫來解決該問題,https://github.com/tidwall/gjson 并且 star 數還很多(甚至名字都是一樣的??),說明這樣的需求大家還是很強烈的。

于是我也打算增加類似的功能,使用方式如下:

圖片

最后還加上了一個四則運算的功能。

面向對象的方式操作 JSON

因為功能類似,所以我參考了 tidwall? 的 API 但去掉一些我覺得暫時用不上的特性,并調整了一點語法。

當前這個版本只能通過確定的 key? 加上 .? 點符號訪問數據,如果是數組則用 [index]? 的方式訪問下標。[] 符號訪問數組我覺得要更符合直覺一些。

以下是一個包含多重嵌套 JSON 的訪問示例:

str := `
{
"name": "bob",
"age": 20,
"skill": {
"lang": [
{
"go": {
"feature": [
"goroutine",
"channel",
"simple",
true
]
}
}
]
}
}`

name := gjson.Get(str, "name")
assert.Equal(t, name.String(), "bob")

age := gjson.Get(str, "age")
assert.Equal(t, age.Int(), 20)

assert.Equal(t, gjson.Get(str,"skill.lang[0].go.feature[0]").String(), "goroutine")
assert.Equal(t, gjson.Get(str,"skill.lang[0].go.feature[1]").String(), "channel")
assert.Equal(t, gjson.Get(str,"skill.lang[0].go.feature[2]").String(), "simple")
assert.Equal(t, gjson.Get(str,"skill.lang[0].go.feature[3]").Bool(), true)

這樣的語法使用個人覺得還是滿符合直覺的,相信對使用者來說也比較簡單。

返回值參考了 tidwall? 使用了一個 Result 對象,它提供了多種方法可以方便的獲取各種類型的數據

func (r Result) String() string
func (r Result) Bool() bool
func (r Result) Int() int
func (r Result) Float() float64
func (r Result) Map() map[string]interface{}
func (r Result) Array() *[]interface{}
func (r Result) Exists() bool

比如使用 Map()/Array()? 這兩個函數可以將 JSON? 數據映射到 map? 和切片中,當然前提是傳入的語法返回的是一個合法 JSONObject 或數組。

實現原理

在實現之前需要先定義一個基本語法,主要支持以下四種用法:

  • 單個key? 的查詢:Get(json,"name")
  • 嵌套查詢:Get(json,"obj1.obj2.obj3.name")
  • 數組查詢:Get(json,"obj.array[0]")
  • 數組嵌套查詢:Get(json,"obj.array[0].obj2.obj3[1].name")

語法很簡單,符合我們日常接觸到語法規則,這樣便可以訪問到 JSON 數據中的任何一個值。

其實實現過程也不復雜,我們已經在上一文中實現將 JSON? 字符串轉換為一個 JSONObject 了。

這次只是額外再解析剛才定義的語法為 token?,然后解析該 token? 的同時再從生成好的 JSONObject 中獲取數據。

最后在解析完 token? 時拿到的 JSONObject 數據返回即可。


圖片

我們以這段查詢代碼為例:

首先第一步是對查詢語法做詞法分析,最終得到下圖的 token。

圖片

在詞法分析過程中也可以做簡單的語法校驗;比如如果包含數組查詢,并不是以 ] 符號結尾時就拋出語法錯誤。

圖片

接著我們遍歷語法的 token。如下圖所示:

圖片

每當遍歷到 token? 類型為 Key 時便從當前的 JSONObject 對象中獲取數據,并用獲取到的值替覆蓋為當前的 JSONObject。

其中每當遇到 . [ ]? 這樣的 token 時便消耗掉,直到我們將 token 遍歷完畢,這時將當前 JSONObject 返回即可。

在遍歷過程中當遇到非法格式時,比如 obj_list[1.]? 便會返回一個空的 JSONObject。

語法校驗這點其實也很容易辦到,因為根據我們的語法規則,Array? 中的 index? 后一定緊接的是一個 EndArray?,只要不是一個 EndArray 便能知道語法不合法了。

有興趣的可以看下解析過程的源碼:

https://github.com/crossoverJie/gjson/blob/cfbca51cc9bc0c77e6cb9c9ad3f964b2054b3826/json.go#L46

對 JSON 做四則運算

str := `{"name":"bob", "age":10,"magic":10.1, "score":{"math":[1,2]}}`
result := GetWithArithmetic(str, "(age+age)*age+magic")
assert.Equal(t, result.Float(), 210.1)
result = GetWithArithmetic(str, "(age+age)*age")
assert.Equal(t, result.Int(), 200)

result = GetWithArithmetic(str, "(age+age) * age + score.math[0]")
assert.Equal(t, result.Int(), 201)

result = GetWithArithmetic(str, "(age+age) * age - score.math[0]")
assert.Equal(t, result.Int(), 199)

result = GetWithArithmetic(str, "score.math[1] / score.math[0]")
assert.Equal(t, result.Int(), 2)

最后我還擴展了一下語法,可以支持對 JSON? 數據中的整形(int、float)做四則運算,雖然這是一個小眾需求,但做完我覺得還挺有意思的,目前在市面上我還沒發現有類似功能的庫,可能和小眾需求有關。

其中核心的四則運算邏輯是由之前寫的腳本解釋器提供的:

?https://github.com/crossoverJie/gscript?

圖片

單獨提供了一個函數,傳入一個四則運算表達式返回計算結果。

由于上一版本還不支持 float,所以這次專門適配了一下。

限于篇幅,更多關于這個四則運算的實現邏輯會在后面繼續分享。

總結

至此算是我第一次利用編譯原理的知識解決了一點特定領域問題,在大學以及工作這些年一直覺得編譯原理比較高深,所以內心一直是抗拒的,但經過這段時間的學習和實踐慢慢的也掌握到了一點門道。

不過目前也只是冰山一角,后面的編譯原理后端更是要涉及到計算機底層知識,所以依然任重而道遠。

已上都是題外話,針對于這個庫我也會長期維護;為了能達到生產的使用要求,盡量提高了單測覆蓋率,目前是98%。

責任編輯:武曉燕 來源: crossoverJie
相關推薦

2022-07-12 08:19:16

XJSON四則運算場景

2024-05-13 00:47:37

JSON對象數據

2023-09-25 09:45:01

數據模型

2011-08-18 14:05:12

NoSQL

2009-10-20 13:58:00

CCIE學習筆記

2015-06-23 13:56:30

數據庫設計面向對象

2017-09-13 10:58:51

JavaScript轉換規則

2022-10-27 10:06:16

Presto SQLAntlr大數據

2016-12-12 13:41:37

iOS簡易加法開發

2017-09-05 16:17:35

JavaScript運算轉換

2010-01-07 16:29:33

使用Json

2011-05-13 11:17:18

javascript

2020-07-20 07:56:28

JavaScript開發技術

2021-10-15 10:39:43

RabbitMQ隊列延遲

2021-03-26 08:41:11

Go語言Docker

2011-03-04 14:58:40

jqueryJSON

2013-03-27 11:33:32

iOS開發iOSjson解析方式

2017-10-16 10:42:27

前端JavaScript浮點數

2009-06-15 14:59:31

Java代碼Java
點贊
收藏

51CTO技術棧公眾號

中国老头性行为xxxx| 高清av免费看| 欧美日韩视频精品二区| 久久天堂精品| 自拍视频国产精品| 色欲欲www成人网站| 一区二区精品伦理...| 国产日韩欧美制服另类| 91免费观看网站| 欧美bbbbbbbbbbbb精品| 欧美激情偷拍自拍| 亚洲黄色有码视频| 亚洲一区二区三区观看| 国产激情视频在线看| 中文字幕中文在线不卡住| 国产欧美欧洲| 97人人爽人人爽人人爽| 亚洲少妇在线| 久久国产精品影片| 国产在线综合视频| 久久激情av| 91精品国产aⅴ一区二区| 999精品网站| 激情在线视频播放| 国产精品国产三级国产aⅴ无密码| 国产精品有限公司| 91中文字幕在线播放| 老鸭窝毛片一区二区三区 | 在线观看免费的av| 亚洲男人av| 亚洲一区二区三区影院| 中文字幕一区二区三区有限公司 | 亚洲欧美自拍视频| 欧美a级在线| 色婷婷综合成人| 中文字幕丰满乱子伦无码专区| 亚洲视频三区| 欧美精品第1页| 无码少妇一区二区三区芒果| 日本а中文在线天堂| 99热国内精品| 日韩激情视频在线| 三上悠亚 电影| 激情欧美一区二区三区黑长吊| 精品国产乱码久久久久久虫虫漫画 | 永久免费在线看片视频| 超碰免费97在线观看| 99re亚洲国产精品| 国产综合欧美在线看| 亚洲精品国产一区二| 国产一区在线不卡| 91在线高清免费观看| 一区二区精品视频在线观看| 蜜臀久久99精品久久久久宅男 | 大片在线观看网站免费收看| 日本蜜桃在线观看| 综合激情成人伊人| 在线看成人av电影| 国产在线观看91| 亚洲天天做日日做天天谢日日欢| 最新欧美日韩亚洲| 麻豆传媒视频在线| 亚洲激情图片一区| 丁香六月激情婷婷| 国产免费拔擦拔擦8x高清在线人 | 久久久精品中文字幕麻豆发布| 久久久久久九九九九| 欧美日韩国产综合视频| 欧美激情综合网| 亚洲一区二区三区涩| 欧美激情黑人| 亚洲一卡二卡三卡四卡五卡| 中国丰满熟妇xxxx性| 九色porny视频在线观看| 黑人巨大精品欧美一区二区三区| 麻豆av免费在线| 成人全视频免费观看在线看| 欧美日韩成人综合天天影院 | 最近2019中文字幕大全第二页| 一级肉体全黄裸片| 亚洲精品成人无限看| 欧美激情精品久久久久| 4438国产精品一区二区| 久久福利资源站| av噜噜色噜噜久久| 男人的天堂在线免费视频| 国产精品色在线| 国产1区2区3区中文字幕| 久久青草伊人| 欧美日韩精品一二三区| aaa黄色大片| 欧美日韩播放| 欧美xxxx做受欧美| 中文字幕69页| 国产美女av一区二区三区| 99国产在线| 青青草视频在线免费观看| 国产精品色婷婷| 台湾无码一区二区| 日韩经典一区| 亚洲精品一区二区三区香蕉 | 亚洲精品国产品国语在线app| 亚洲熟妇无码一区二区三区| 亚洲精品555| 亚洲国产天堂网精品网站| 天堂网av2018| 国产欧美一区二区色老头| 91精品国产综合久久久久久蜜臀 | 91污在线观看| 超碰免费在线公开| 欧美日韩123区| 日韩欧美在线一区二区三区| 欧美 日韩 国产 成人 在线观看| 欧美日韩理论| 国产日本欧美一区二区三区| 日本精品一二区| 亚洲视频在线观看一区| 久久精品99国产| 国产成人aa在线观看网站站| 久久夜色精品国产欧美乱| 亚洲天堂五月天| 成人国产精品免费观看| 一区二区精品在线| 男人最爱成人网| 亚洲黄色免费三级| 久久久久久免费观看| 激情文学综合插| 亚洲第一导航| 国产精品高清乱码在线观看| 亚洲精品丝袜日韩| 国产女同在线观看| 成人动漫一区二区三区| 成人一级生活片| 精品国产乱码一区二区三区| 丝袜美腿亚洲一区二区| 国产在线观看第一页| 久久久久国色av免费看影院| 国产69精品久久久久999小说| 精品久久国产一区| 久久国产精品影片| 99热在线只有精品| 亚洲女与黑人做爰| 一级黄色片国产| 日韩精品久久| 国产伦精品一区二区三区精品视频| 免费成人av电影| 欧美性生交xxxxx久久久| 久久人妻少妇嫩草av无码专区| 欧美日本在线| 成人综合av网| 国产盗摄在线视频网站| 欧美成人官网二区| 久久精品久久国产| 成人免费黄色在线| 91精品国产91久久久久麻豆 主演| 一区二区三区在线资源| 欧美激情视频在线观看| 亚洲第一视频在线播放| 亚洲曰韩产成在线| 奇米777第四色| 国产精品入口66mio| 蜜桃av噜噜一区二区三区| 日本免费一区二区六区| 亚洲欧美日韩另类| 中文字幕av影视| 亚洲欧美在线视频观看| 超碰在线免费av| 国产精品a久久久久| 国产精品区免费视频| 亚洲美女尤物影院| 一区二区三区www| 91超薄丝袜肉丝一区二区| 亚洲精品视频一区二区| 亚洲一区二区三区四区av| 国产农村妇女毛片精品久久莱园子| 久久大香伊蕉在人线观看热2| 日韩电影网站| 久久久97精品| 狠狠综合久久av一区二区| 欧美午夜片欧美片在线观看| 欧美a在线播放| 国产精品88av| 人妻有码中文字幕| 91视频精品| 国产嫩草一区二区三区在线观看| 中文字幕在线官网| www.欧美精品一二三区| 亚洲精品福利网站| 在线视频亚洲一区| 欧美第一页在线观看| 99精品欧美一区二区三区小说| 黑人粗进入欧美aaaaa| 欧美成人一区二免费视频软件| 精品日本一区二区三区在线观看| 日韩欧美精品一区二区综合视频| 欧美美女操人视频| 国产在线视频福利| 日韩精品在线网站| 久久久蜜桃一区二区| 亚洲精品一二三| 亚洲区免费视频| 国产91丝袜在线播放九色| 男人透女人免费视频| 亚洲婷婷在线| 亚洲精品久久区二区三区蜜桃臀 | 日韩女优av电影在线观看| 国产成人在线免费视频| 日韩一区在线免费观看| 少妇户外露出[11p]| 国产一区二区三区精品欧美日韩一区二区三区 | 成人免费福利视频| 桃色av一区二区| 欧美激情极品视频| 毛片在线播放a| 国产亚洲视频在线观看| 天堂网在线播放| 欧美一区二区三区免费在线看 | 日韩一区二区在线看| 黄色一区二区视频| 欧美日韩免费看| 久久久www成人免费毛片| 国产精品久久看| 偷拍夫妻性生活| av高清久久久| 国产无套精品一区二区三区| 美女诱惑一区二区| 国产精品igao| 老司机精品视频网站| 国产人妻777人伦精品hd| 欧美日韩福利| 欧美三级午夜理伦三级老人| 日韩国产在线| 日韩久久久久久久久久久久久| 久久久久影视| 国产精品一国产精品最新章节| 久久久91麻豆精品国产一区| 成人免费大片黄在线播放| 99re久久| 国产精品视频精品视频| 欧美成人app| 国产欧美一区二区三区在线看| 黄色精品视频| 国产精品激情av在线播放| 性高爱久久久久久久久| 国产成人极品视频| 怡红院成人在线| 国产精品成人一区二区| 浪潮色综合久久天堂| 国产精品久久久久久久久久久久久久 | 特黄特黄一级片| 国产一区欧美一区| 日本高清免费观看| 国产精品一区二区不卡| 91丨porny丨九色| 粉嫩嫩av羞羞动漫久久久| 亚洲综合中文网| 99riav久久精品riav| 白丝女仆被免费网站| 亚洲国产成人午夜在线一区| a级黄色免费视频| 国产精品福利一区二区三区| 日韩激情小视频| 亚洲综合丝袜美腿| 制服.丝袜.亚洲.中文.综合懂色| 欧美午夜激情视频| 中文天堂在线资源| 666欧美在线视频| 懂色av蜜臀av粉嫩av分享吧| 亚洲国产一区二区三区四区| 国产尤物视频在线| 日韩一区在线视频| 欧美wwww| 欧美在线精品免播放器视频| 成人国产精品入口免费视频| 91九色视频导航| 成人中文字幕视频| 欧美日韩喷水| 希岛爱理一区二区三区| 999一区二区三区| 久久久久久夜| 婷婷激情小说网| av电影在线观看一区| 国产在线综合视频| 亚洲综合在线观看视频| 亚洲天堂男人av| 欧美区在线观看| 天堂av中文字幕| 中文在线不卡视频| 欧美bbbxxxxx| 国产精品va在线播放我和闺蜜| 精品久久国产一区| 免费观看成人高| 女人天堂亚洲aⅴ在线观看| aa在线免费观看| 国产一区二区三区四| 免费在线观看成年人视频| 亚洲视频1区2区| 精品免费囯产一区二区三区| 欧美一区二区精美| 国产区视频在线| 欧美精品久久一区二区| 视频精品导航| 玛丽玛丽电影原版免费观看1977| 91国语精品自产拍| 成熟老妇女视频| 国产不卡一区视频| 成人信息集中地| 欧美日韩一区二区在线 | 中文字幕日韩精品一区二区| av不卡在线| 久草福利在线观看| 日本一二三不卡| 日本在线播放视频| 日韩精品中文字幕一区| 男人天堂久久久| 国产精品99久久久久久久久| 北条麻妃一区二区三区在线观看 | 欧美三级一区二区| 欧美日本韩国一区二区| 欧美激情中文字幕乱码免费| 国产精品国产亚洲精品| 日日噜噜噜噜夜夜爽亚洲精品| 国产日韩一区| 永久免费未满蜜桃| 亚洲精品视频在线看| 国产有码在线观看| 伊人青青综合网站| 欧美片第一页| 欧美精品成人一区二区在线观看 | 亚洲综合色网站| 国产精品系列视频| 精品国产一区av| 国产韩日精品| 亚洲国产激情一区二区三区| 久久精品123| 超碰97人人干| 一本一道久久a久久精品| 四季av日韩精品一区| 97视频在线看| 六月丁香久久丫| 亚洲熟妇av日韩熟妇在线 | 国产av自拍一区| 色婷婷av一区二区三区之一色屋| 日韩中文字幕免费观看| 国产最新精品视频| 成人av资源网址| 无码专区aaaaaa免费视频| 成人黄色小视频在线观看| 丰满少妇乱子伦精品看片| 亚洲精品福利在线观看| 在线观看网站免费入口在线观看国内 | 亚洲大奶少妇| 国产精品视频一二三四区| 成人国产精品免费网站| 日本一级一片免费视频| 日韩av中文字幕在线播放| 亚洲天堂手机| 热re99久久精品国99热蜜月| 日韩av电影天堂| 欧美美女性生活视频| 欧美精品1区2区3区| 性欧美videoshd高清| 国产高清在线一区| 最新亚洲激情| 永久免费成人代码| 欧美丰满一区二区免费视频| 99在线视频观看| 国产一区二区黄色| 久久综合伊人| 成人自拍小视频| 亚洲成人激情在线| 欧美日韩视频网站| 中文字幕中文字幕99| 波多野结衣在线一区| 日本中文字幕在线观看视频| www.欧美免费| 日韩电影不卡一区| 中文字幕 91| 亚洲国产视频一区二区| 美州a亚洲一视本频v色道| 国产日韩欧美另类| 亚洲黄色免费| 亚洲色图 激情小说| 欧美大片免费久久精品三p | 欧美亚洲丝袜传媒另类| av网站网址在线观看| 久久久亚洲综合网站| 麻豆成人免费电影| 久久精品无码人妻| 一区二区日韩精品| 国产精品xxxav免费视频| 天美星空大象mv在线观看视频| 亚洲精品日日夜夜| 欧洲亚洲精品视频| 亚洲精品欧美极品| 老色鬼久久亚洲一区二区| 久久久综合久久| 中文字幕亚洲字幕| 久久资源综合| 一级网站在线观看|