go语言快速入门:JSON处理(24)

本文来自 liumiaocn 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/liumiaocn/article/details/55504497

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的两种不同结构,实际使用时的形式如下:

“名称/值”对的集合

对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
go语言快速入门:JSON处理(24)_第1张图片

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

数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
go语言快速入门:JSON处理(24)_第2张图片

组成要素

对于其组成要素的value/string/number,在JSON中是这样理解的:

value

值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
go语言快速入门:JSON处理(24)_第3张图片

string

字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。
go语言快速入门:JSON处理(24)_第4张图片

number

数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
go语言快速入门:JSON处理(24)_第5张图片

另外,空白可以加入到任何符号之间。

各种语言的实现

语言 实现方式
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 ~]#

执行结果

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

为什么没有输出正确结果?构造体的成员变量小写,外部不可看。非要小写的话可以使用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 ~]#

执行结果

[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 ~]#

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 ~]#

执行结果

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

总结

在这篇文章中,我们学习到了JSON的基础知识以及go语言中如何将JSON格式和构造体进行相互之间的转换。但是嵌套的JSON格式以及流方式下go语言如何使用等实际中使用地也比较的多,在后续的讨论中会结合实际的应用慢慢展开。

参考

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

你可能感兴趣的:(go语言)