<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] 還有個包[https://github.com/buger/jsonparser](https://github.com/buger/jsonparser) # gjson包 ## 安裝使用 ~~~ go get -u github.com/tidwall/gjson ~~~ ~~~ const json = `{"name":[{"first":"Janet","last":"Prichard"}, {"abc": 1, "e" : 2}],"age":47}` func main() { v := gjson.Get(json, "name") if v.String() == "" { fmt.Println("nil") } else { fmt.Println(v.String()) fmt.Println(v.Type) } } ~~~ ## 簡單的解析和獲取 有一個`Parse(json)`函數可以進行簡單的解析,然后`result.Get(path)`搜索結果。 例如,所有這些都將返回相同的結果 ~~~ gjson.Parse(json).Get("name").Get("last") gjson.Get(json, "name").Get("last") gjson.Get(json, "name.last") ~~~ ## 路徑匹配 路徑是由點分隔的一系列鍵。密鑰可能包含特殊的通配符'\*'和'?'。要訪問數組值,請使用索引作為鍵。要獲取數組中的元素數或訪問子路徑,請使用“#”字符。點和通配符可以使用'\\'進行轉義 ~~~ { "name": {"first": "Tom", "last": "Anderson"}, "age":37, "children": ["Sara","Alex","Jack"], "fav.movie": "Deer Hunter", "friends": [ {"first": "Dale", "last": "Murphy", "age": 44}, {"first": "Roger", "last": "Craig", "age": 68}, {"first": "Jane", "last": "Murphy", "age": 47} ] } ~~~ 匹配結果 ~~~ "name.last" >> "Anderson" "age" >> 37 "children" >> ["Sara","Alex","Jack"] "children.#" >> 3 "children.1" >> "Alex" "child*.2" >> "Jack" "c?ildren.0" >> "Sara" "fav\.movie" >> "Deer Hunter" "friends.#.first" >> ["Dale","Roger","Jane"] "friends.1.last" >> "Craig" ~~~ ## 反向匹配 您還可以使用`#[...]`或查找所有匹配項來查詢第一個匹配項的數組`#[...]#`。查詢支持`==`,`!=`,`<`,`<=`,`>`,`>=`比較運算符和簡單模式匹配`%`(像)和`!%`選項 ~~~ friends.#[last=="Murphy"].first >> "Dale" friends.#[last=="Murphy"]#.first >> ["Dale","Jane"] friends.#[age>45]#.last >> ["Craig","Murphy"] friends.#[first%"D*"].last >> "Murphy" ~~~ ## 結果類型 GJSON支持JSON類型`string`,`number`,`bool`,和`null`。數組和對象作為原始json類型返回。 該`Result`類型包含以下其中一種: ~~~ bool, for JSON booleans float64, for JSON numbers string, for JSON string literals nil, for JSON null ~~~ 要直接訪問該值: ~~~ result.Type //可以是String,Number,True,False,Null或JSON result.Str //保存字符串 result.Num //保存float64數字 result.Raw //保存原始json result.Index //原始json中原始值的索引,零表示索引未知 ~~~ 有各種方便的功能可以處理結果 ~~~ result.Exists() bool result.Value() interface{} result.Int() int64 result.Uint() uint64 result.Float() float64 result.String() string result.Bool() bool result.Time() time.Time result.Array() []gjson.Result result.Map() map[string]gjson.Result result.Get(path string) Result result.ForEach(iterator func(key, value Result) bool) result.Less(token Result, caseSensitive bool) bool ~~~ 該`result.Value()`函數返回一個`interface{}`需要類型斷言的函數,它是以下Go類型之一: 該`result.Array()`函數返回一組值。如果結果表示不存在的值,則返回空數組。如果結果不是JSON數組,則返回值將是包含一個結果的數組。 ~~~go boolean >> bool number >> float64 string >> string null >> nil array >> [] interface {} object >> map [ string ] interface {} ~~~ # 判斷某個值是否存在: ~~~ value := gjson.Get(json, "name.last") if !value.Exists() { println("no last name") } else { println(value.String()) } // Or as one step if gjson.Get(json, "name.last").Exists() { println("has a last name") } ~~~ # 驗證json格式 ~~~ if !gjson.Valid(json) { return errors.New("invalid json") } value := gjson.Get(json, "name.last") ~~~ # 修飾符和路徑鏈接 版本1.2中的新功能支持修改器功能和路徑鏈接。 修飾符是在json上執行自定義處理的路徑組件。 可以使用管道字符將多個路徑“鏈接”在一起。這對于從修改后的查詢中獲取結果非常有用。 例如,使用`@reverse`上面json文檔中的內置修飾符,我們將得到`children`數組并反轉順序: ~~~ "children|@reverse" >> ["Jack","Alex","Sara"] "children|@reverse|0" >> "Jack" ~~~ 目前有三種內置修飾符: * `@reverse`:反轉數組或對象的成員。 * `@ugly`:從json文檔中刪除所有空格。 * `@pretty`:使json文檔更具人性化 # 自定義修改器 您還可以添加自定義修改器。 例如,這里我們創建一個修飾符,使整個json文檔大寫或小寫 ~~~go gjson.AddModifier("case", func(json, arg string) string { if arg == "upper" { return strings.ToUpper(json) } if arg == "lower" { return strings.ToLower(json) } return json }) ~~~ ~~~ "children|@case:upper" >> ["SARA","ALEX","JACK"] "children|@case:lower|@reverse" >> ["jack","alex","sara"] ~~~ # json Lines ~~~ {"name": "Gilbert", "age": 61} {"name": "Alexa", "age": 34} {"name": "May", "age": 57} {"name": "Deloise", "age": 44} ~~~ ~~~ ..# >> 4 ..1 >> {"name": "Alexa", "age": 34} ..3 >> {"name": "Deloise", "age": 44} ..#.name >> ["Gilbert","Alexa","May","Deloise"] ..#[name="May"].age >> 57 ~~~ 該`ForEachLines`函數將遍歷JSON行 ~~~ gjson.ForEachLine(json, func(line gjson.Result) bool{ println(line.String()) return true }) ~~~ # 獲取嵌套數組值 假設您想要以下json中的所有姓氏 ~~~ { "programmers": [ { "firstName": "Janet", "lastName": "McLaughlin", }, { "firstName": "Elliotte", "lastName": "Hunter", }, { "firstName": "Jason", "lastName": "Harold", } ] } ~~~ 獲取所有的lastName ~~~ result := gjson.Get(json, "programmers.#.lastName") for _, name := range result.Array() { println(name.String()) } ~~~ 您還可以查詢數組中的對象: ~~~ name := gjson.Get(json, `programmers.#[lastName="Hunter"].firstName`) println(name.String()) // prints "Elliotte" ~~~ # 遍歷對象或數組 該`ForEach`函數允許快速迭代對象或數組。鍵和值將傳遞給對象的迭代器函數。僅為數組傳遞值。`false`從迭代器返回將停止迭代 ~~~ result := gjson.Get(json, "programmers") result.ForEach(func(key, value gjson.Result) bool { println(value.String()) return true // keep iterating }) ~~~ # 解開到map 解開到map\[string\]interface{} ~~~ m, ok := gjson.Parse(json).Value().(map[string]interface{}) if !ok { // not a map } ~~~ # 使用字節 如果您的JSON包含在`[]byte`切片中,那么就是[GetBytes](https://godoc.org/github.com/tidwall/gjson#GetBytes)函數。這是優先的`Get(string(data), path)` ~~~ var json []byte = ... result := gjson.GetBytes(json, path) ~~~ 如果您正在使用該`gjson.GetBytes(json, path)`功能并且想要避免轉換`result.Raw`為a`[]byte`,則可以使用此模式 ~~~ var json []byte = ... result := gjson.GetBytes(json, path) var raw []byte if result.Index > 0 { raw = json[result.Index:result.Index+len(result.Raw)] } else { raw = []byte(result.Raw) } ~~~ 這是原始json的盡力而為的無分配子切片。該方法利用`result.Index`字段,該字段是原始json中原始數據的位置。有可能值`result.Index`等于零,在這種情況下`result.Raw`轉換為a`[]byte` # 一次獲取多個值 該`GetMany`函數可用于同時獲取多個值 ~~~ results := gjson.GetMany(json, "name.first", "name.last", "age") ~~~ 返回值為a`[]Result`,它將始終包含與輸入路徑完全相同的項目數 # 格式化 要開始使用Pretty,請安裝Go并運行`go get`: ~~~shell $ go get -u github.com/tidwall/pretty ~~~ ~~~ const json = `{ "name": {"first": "Tom", "last": "Anderson"}, "age":37, "children": ["Sara","Alex","Jack"], "fav.movie": "Deer Hunter", "friends": [ {"first": "Dale", "last": "Murphy", "age": 44}, {"first": "Roger", "last": "Craig", "age": 68}, {"first": "Jane", "last": "Murphy", "age": 47} ] }` func main() { var byteSlice []byte byteSlice = []byte(json) res := pretty.Pretty(byteSlice) fmt.Println(string(res)) } ~~~ 加上顏色 ~~~ result = pretty.Color(json, nil) ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看