1. 程式人生 > >go語言快速入門 JSON處理 24

go語言快速入門 JSON處理 24

同時 perl iot basic style 引號 零基礎 字典 run

JSON作為一種易讀的輕量級的數據交換格式,被廣泛地使用著。在這篇文章中我們將會介紹一下JSON的基礎知識和go語言中JSON的處理方式。

JSON

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。 易於人閱讀和編寫。同時也易於機器解析和生成。 它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON采用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成為理想的數據交換語言。

JSON的結構和實現

JSON有兩種基本結構:名稱/值以及值的有序列表,在不同語言中的具體實現方式往往根據語言的特點也有所不同

項目具體的實現
“名稱/值”對的集合(A collection of name/value pairs) 不同的語言中,它被理解為對象(object),紀錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關聯數組 (associative array)。
值的有序列表(An ordered list of values) 在大部分語言中,它被理解為數組(array)。

JSON形式

JSON的兩種不同結構,實際使用時的形式如下:

“名稱/值”對的集合

對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”後跟一個“:”(冒號);“‘名稱/值’ 對”之間使用“,”(逗號)分隔。
技術分享圖片

值的有序列表(An ordered list of values)

數組是值(value)的有序集合。一個數組以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔。
技術分享圖片

組成要素

對於其組成要素的value/string/number,在JSON中是這樣理解的:

value

值(value)可以是雙引號括起來的字符串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。
技術分享圖片

string

字符串(string)是由雙引號包圍的任意數量Unicode字符的集合,使用反斜線轉義。一個字符(character)即一個單獨的字符串(character string)。字符串(string)與C或者Java的字符串非常相似。
技術分享圖片

number

數值(number)也與C或者Java的數值非常相似。除去未曾使用的八進制與十六進制格式。除去一些編碼細節。
技術分享圖片

另外,空白可以加入到任何符號之間。

各種語言的實現

語言實現方式
C JSON_checker.|YAJL.|LibU.|json-c.|json-parser.|jsonsl.|WJElement.|M’s JSON parser.|cJSON.|Jansson.|jsmn.|parson.|ujson4c.|nxjson.|frozen.|microjson.
C++ JSONKit.|jsonme–.|ThorsSerializer.|JsonBox.|jvar.|rapidjson.|JSON for Modern C++.|qmjson.|minijson.|jsoncons.|JSON Support in Qt.|QJson.|jsoncpp.|JOST.|CAJUN.|libjson.|nosjob.|JSON++.|JSON library for IoT.
Java JSON-java.|JSONUtil.|jsonp.|Json-lib.|Stringtree.|SOJO.|json-taglib.|Flexjson.|JON tools.|Argo.|jsonij.|fastjson.|mjson.|jjson.|json-simple.|json-io.|JsonMarshaller.|google-gson.|Json-smart.|FOSS Nova JSON.|Corn CONVERTER.|Apache johnzon.|Genson.|JSONUtil.|cookjson.
Python The Python Standard Library.|simplejson.|pyson.|Yajl-Py.|ultrajson.|metamagic.json.
Object C NSJSONSerialization.|json-framework.|JSONKit.|yajl-objc.|TouchJSON.
Bash Jshon.|JSON.sh.
Go package json.

go中的JSON處理

go使用encoding/json進行JSON處理,常用到的內容進行如下整理:

項目詳細使用方式
標準包 encoding/json import “encoding/json”
Decoding json數據-〉go數據結構 func Unmarshal(data []byte, v interface{}) error
Encoding go數據結構-〉json數據 func Marshal(v interface{}) ([]byte, error)

go數據結構-〉json數據

例子代碼

[root@liumiaocn ~]# cat basic-json-encode.go
package main

import "fmt"
import "encoding/json"

func main() {

        type person struct {
                id      int
                name    string
                country string
        }

        //go struct person
        liumiao := person{1001, "liumiao", "China"}
        fmt.Println("liumiao=", liumiao)

        result, err := json.Marshal(liumiao)
        if err != nil {
                fmt.Println("encoding failed...")
        } else {
                fmt.Println("JSON RESULT = ", result)
                fmt.Println("JSON RESULT(string) = ", string(result))
        }
}
[root@liumiaocn ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

執行結果

[root@liumiaocn ~]# go run basic-json-encode.go
liumiao= {1001 liumiao China}
JSON RESULT =  [123 125]
JSON RESULT(string) =  {}
[root@liumiaocn ~]#
  • 1
  • 2
  • 3
  • 4
  • 5

為什麽沒有輸出正確結果?構造體的成員變量小寫,外部不可看。非要小寫的話可以使用tag,這裏就直接改成大寫再作確認:

[root@liumiaocn ~]# cat basic-json-encode-2.go
package main

import "fmt"
import "encoding/json"

func main() {

        type person struct {
                Id      int
                Name    string
                Country string
        }

        //go struct person
        liumiao := person{1001, "liumiao", "China"}
        fmt.Println("liumiao=", liumiao)

        result, err := json.Marshal(liumiao)
        if err != nil {
                fmt.Println("encoding failed...")
        } else {
                fmt.Println("JSON RESULT = ", result)
                fmt.Println("JSON RESULT(string) = ", string(result))
        }
}
[root@liumiaocn ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

執行結果

[root@liumiaocn ~]# go run basic-json-encode-2.go
liumiao= {1001 liumiao China}
JSON RESULT =  [123 34 73 100 34 58 49 48 48 49 44 34 78 97 109 101 34 58 34 108 105 117 109 105 97 111 34 44 34 67 111 117 110 116 114 121 34 58 34 67 104 105 110 97 34 125]
JSON RESULT(string) =  {"Id":1001,"Name":"liumiao","Country":"China"}
[root@liumiaocn ~]#
  • 1
  • 2
  • 3
  • 4
  • 5

json數據-〉go數據結構

例子代碼

[root@liumiaocn ~]# cat basic-json-decode.go
package main

import "fmt"
import "encoding/json"

func main() {

        type person struct {
                Id      int
                Name    string
                Country string
        }

        //json data
        jdata := []byte(`{"Id":1001,"Name":"liumiao","Country":"China"}`)
        var liumiao person

        err := json.Unmarshal(jdata, &liumiao)
        if err != nil {
                fmt.Println("decoding failed...")
        } else {
                fmt.Println("go struct = ", liumiao)
        }
}
[root@liumiaocn ~]#
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

執行結果

[root@liumiaocn ~]# go run basic-json-decode.go
go struct =  {1001 liumiao China}
[root@liumiaocn ~]#
  • 1
  • 2
  • 3

總結

在這篇文章中,我們學習到了JSON的基礎知識以及go語言中如何將JSON格式和構造體進行相互之間的轉換。但是嵌套的JSON格式以及流方式下go語言如何使用等實際中使用地也比較的多,在後續的討論中會結合實際的應用慢慢展開。

參考

http://json.org/json-zh.html
https://golang.org/pkg/encoding/json/
https://blog.golang.org/json-and-go

再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

go語言快速入門 JSON處理 24