本文来自 liumiaocn 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/liumiaocn/article/details/55504497
JSON作为一种易读的轻量级的数据交换格式,被广泛地使用着。在这篇文章中我们将会介绍一下JSON的基础知识和go语言中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有两种基本结构:名称/值以及值的有序列表,在不同语言中的具体实现方式往往根据语言的特点也有所不同
项目 | 具体的实现 |
---|---|
“名称/值”对的集合(A collection of name/value pairs) | 不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。 |
值的有序列表(An ordered list of values) | 在大部分语言中,它被理解为数组(array)。 |
JSON的两种不同结构,实际使用时的形式如下:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
对于其组成要素的value/string/number,在JSON中是这样理解的:
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。
数值(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使用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) |
[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 ~]#
[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