国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

用面向對象的方式操作 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技術棧公眾號

欧美军同video69gay| 亚洲在线视频福利| 欧美在线色视频| 最新中文字幕2018| 99久久综合精品| 中文日韩在线观看| 欧洲精品一区二区三区久久| 日韩国产网站| 日韩欧中文字幕| 国产一区二区三区四区五区在线| 在线三级av| 亚洲xxx拳头交| 91国语精品自产拍在线观看性色| 日日夜夜天天综合| 亚洲美女激情视频| 黄色一级免费大片| 国产中文精品久高清在线不| 亚洲激情综合网| 三级视频中文字幕| 久久久久久夜精品精品免费| 波多野结衣家庭教师在线| 免费视频国产一区| 97成人精品区在线播放| 欧美中文高清| 欧美激情视频一区二区三区不卡| xxav视频| 亚洲自拍与偷拍| 在线国产视频观看| 欧美色图第一页| 免费超爽大片黄| 成人永久aaa| 国产精品一区久久久| 久久超碰99| 91久久久亚洲精品| 国模吧视频一区| 欧美专区一二三| 国产精品中文字幕日韩精品 | 欧美喷潮久久久xxxxx| 欧洲美女少妇精品| 亚洲国产天堂网精品网站| 色吧亚洲日本| 欧美成人在线免费| 国产一区二区三区网| 国产精成人品localhost| 三级成人黄色影院| 欧美猛男性生活免费| 国产在线视频网站| 91麻豆精品秘密| 性直播在线观看| 国产欧美不卡| 国产一区一区三区| 欧美精品momsxxx| 国产精品视频久久| 日精品一区二区| 少妇性饥渴无码a区免费| 自拍偷在线精品自拍偷无码专区| 免费在线高清av| 国产一区二区三区在线视频| 国产伦精品一区二区三区在线播放 | 日韩精品一区二区视频| 欧州一区二区三区| 国产日韩av在线| 欧美一级做一级爱a做片性| 69影院欧美专区视频| 亚洲午夜av| 高清在线观看免费| 欧美日韩在线视频首页| 电影天堂国产精品| 国产精品网站视频| 国产91丝袜在线播放0| 亚洲成人套图| 色久欧美在线视频观看| 欧美精品综合| 日韩av电影在线网| 日韩精品一级中文字幕精品视频免费观看 | 日本精品视频在线观看| 国产欧美精品久久| 国产三级三级三级看三级| 色欧美乱欧美15图片| 亚洲成人精品综合在线| 国产精品区一区二区三在线播放 | 亚洲高清国产拍精品26u| 91久久偷偷做嫩草影院| 成人动漫一区二区三区| 国产系列在线观看| 亚洲免费在线看| 自慰无码一区二区三区| 都市激情亚洲色图| 96视频在线观看欧美| 亚洲视频国产视频| 1024在线播放| 欧美日韩不卡一区二区| 老司机精品在线| 妞干网这里只有精品| 一本到三区不卡视频| 欧一区二区三区| 亚洲一区二区四区| 色屁屁一区二区| 最新亚洲精品| 日韩免费一级视频| 亚洲国产成人精品一区二区| 国产精品麻豆久久| 亚州精品一二三区| 中文字幕亚洲综合久久| 久久亚洲风情| youjizz在线播放| 在线看国产一区二区| 欧美电影免费网站| 成人性免费视频| 亚洲国产精品美女| 一本色道久久精品| 国产日韩二区| 亚洲成在人线免费| 婷婷亚洲一区二区三区| 国内免费久久久久久久久久久| 国产一区二区剧情av在线| 大胆欧美熟妇xx| 日韩视频在线一区二区| 麻豆mv在线观看| ts人妖另类在线| 香蕉影视欧美成人| 国产成人一区二区三区影院| 亚洲一区日韩精品| 亚洲成人免费视频| 欧美精品密入口播放| 欧美牲交a欧美牲交aⅴ免费下载| 亚洲欧美中文另类| 国产精品系列在线观看| 国产在线看片免费视频在线观看| 久久99国产精品99久久| 欧美亚洲自拍偷拍| 影音先锋久久| 成人国产免费电影| 亚洲在线色站| 一色桃子一区二区| 91网上在线视频| 澳门久久精品| 99久久无色码| 欧美日韩精品在线观看| 午夜精品一区二区三区国产 | 草草影院在线观看| 国产精品一区在线播放| 欧美丝袜丝nylons| 亚洲久色影视| 蜜臀av在线| 欧美高清视频免费观看| 久久日文中文字幕乱码| 欧美风狂大伦交xxxx| 国产精品美女免费视频| 精品毛片三在线观看| 欧美黄色一区二区| www国产无套内射com| 亚洲欧美精品在线| 成人av网站在线观看| 99国产精品免费网站| 毛片.com| 国产一区二区三区奇米久涩 | 97超视频免费观看| 午夜精品一区二区三区电影天堂| 欧美激情另类| av黄色在线| 精品国产av无码一区二区三区| 亚洲欧美怡红院| 日韩在线视频精品| 欧美18hd| www.av蜜桃| 国产91精品网站| 欧美日韩中文国产| 懂色av一区二区三区免费观看 | 国产亚洲视频中文字幕视频| 久久蜜桃av一区精品变态类天堂 | 国产99久久精品| 日韩成人动漫在线观看| 国产高清一级毛片在线不卡| 日韩欧美视频第二区| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 尤物视频一区二区| 99精品视频免费| 欧美一区二区三区婷婷| eeuss在线观看| www亚洲国产| 欧美一级视频免费在线观看| 麻豆国产精品一区二区三区| gogo高清免费视频| 国产91视觉| 日韩av影视在线| 综合激情在线| 色偷偷亚洲女人天堂观看欧| 91午夜理伦私人影院| 日韩激情视频在线| 中文字幕一区二区三| 亚洲激情av| 精品国产乱码久久久久久樱花| 天堂a中文在线| 国产精品入口芒果| 亚洲一区二区久久久久久| 在线精品视频视频中文字幕| 精品女同一区二区三区在线播放| a级高清视频欧美日韩| 亚洲婷婷在线|