通過Go來分析和建立JSON
一、分析JSON
首先了解一下JSON的語法規則
JSON 語法是 JavaScript 物件表示語法的子集。
- 資料在名稱/值對中
- 資料由逗號分隔
- 大括號儲存物件
- 中括號儲存陣列
把結構對映到JSON只有一個通用規則:對於名字為json:"<name>"
,就可以把JSON鍵
下面是要分析的JSON檔案
{
"id":1,
"content":"Hello World",
"author":{
"id":2,
"name":"Sau She"
},
"comments":[
{
"id":3,
"content":"Have a great day!",
"author":"Adam"
},
{
"id":4,
"content":"How are you today!",
"author":"Betty"
}
]
}
下面給出分析程式
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
)
type Post struct {
Id int `json:"id"`
Content string `json:"content"`
Author Author `json:"author"`
Comments []Comment `json:"comments"`
}
type Author struct {
Id int `json:"id"`
Name string `json:"name"`
}
type Comment struct {
Id int `json:"id"`
Content string `json:"content"`
Author string `json:"author"`
}
func main() {
file, err := os.Open("src/text/json/post.json")
if err != nil {
log.Fatalf("Error opening JSON file %v",err)
return
}
defer file.Close()
bytes, err := ioutil.ReadAll(file)
if err != nil {
log.Fatalf("Error reading JSON file %v",err)
return
}
var post Post
json.Unmarshal(bytes,&post)
fmt.Println(post)
}
使用者出了可以用Unmarshal函式來解封JSON,還可以使用Decoder手動地將JSON資料解碼到結構體裡面,以此來處理流式的JSON資料。
package main
import (
"encoding/json"
"io"
"log"
"os"
)
type Post struct {
Id int `json:"id"`
Content string `json:"content"`
Author Author `json:"author"`
Comments []Comment `json:"comments"`
}
type Author struct {
Id int `json:"id"`
Name string `json:"name"`
}
type Comment struct {
Id int `json:"id"`
Content string `json:"content"`
Author string `json:"author"`
}
func main() {
file, err := os.Open("src/text/json/post.json")
if err != nil {
log.Fatalf("Error opening JSON file %v",err)
return
}
defer file.Close()
decoder := json.NewDecoder(file)
for {
var post Post
err := decoder.Decode(&post)
if err == io.EOF {
break
}
if err != nil{
log.Fatalf("Error decoding JSON %v",err)
return
}
}
}
最後,在面對JSON資料時,我們可以根據輸入決定使用Decode還是Unmarshal:如果JSON資料來源是io.Reader流,如http.Request的Body,那麼使用Decoder更好;如果JSON資料來源於字串或者是記憶體的某個地方,那麼使用Unmarshal更好。
二、建立JSON
package main
import (
"encoding/json"
"io/ioutil"
"log"
)
type Post struct {
Id int `json:"id"`
Content string `json:"content"`
Author Author `json:"author"`
Comments []Comment `json:"comments"`
}
type Author struct {
Id int `json:"id"`
Name string `json:"name"`
}
type Comment struct {
Id int `json:"id"`
Content string `json:"content"`
Author string `json:"author"`
}
func main() {
post := Post{
Id:1,
Content:"Hello World!",
Author:Author{
Id:2,
Name:"Sau Sheong",
},
Comments: []Comment{{
Id:1,
Content:"i love sz",
Author:"zhu",
},{
Id:2,
Content:"i love sh",
Author:"liu",
}},
}
output, err := json.MarshalIndent(&post,"","\t")
if err != nil {
log.Fatalf("Error marshalling to JSON %v",err)
return
}
err = ioutil.WriteFile("src/text/json/post2.json",output,0644)
if err != nil {
log.Fatalf("Error writing JSON to file %v",err)
return
}
}
讓我看看post2.json檔案裡面的內容
{
"id": 1,
"content": "Hello World!",
"author": {
"id": 2,
"name": "Sau Sheong"
},
"comments": [
{
"id": 1,
"content": "i love sz",
"author": "zhu"
},
{
"id": 2,
"content": "i love sh",
"author": "liu"
}
]
}
我們也可通過編碼器手動將Go結構編碼為JSON資料。
package main
import (
"encoding/json"
"log"
"os"
)
type Post struct {
Id int `json:"id"`
Content string `json:"content"`
Author Author `json:"author"`
Comments []Comment `json:"comments"`
}
type Author struct {
Id int `json:"id"`
Name string `json:"name"`
}
type Comment struct {
Id int `json:"id"`
Content string `json:"content"`
Author string `json:"author"`
}
func main() {
post := Post{
Id:1,
Content:"Hello World!",
Author:Author{
Id:2,
Name:"Sau Sheong",
},
Comments: []Comment{{
Id:1,
Content:"i love sz",
Author:"zhu",
},{
Id:2,
Content:"i love sh",
Author:"liu",
}},
}
jsonFile, err := os.Create("src/text/json/post3.json")
if err != nil {
log.Fatalf("Error Create JSON to file %v",err)
return
}
encoder := json.NewEncoder(jsonFile)
encoder.SetIndent("","\t")
encoder.Encode(&post)
if err != nil {
log.Fatalf("Error encoding JSON to file %v",err)
return
}
}
程式會建立一個用於儲存JSON資料的JSON檔案,並通過把這個檔案傳遞給NewEncoder函式來建立一個編碼器。接著,程式會呼叫編碼器的Encode方法,並向其傳遞一個指向Post結構的引用。在此以後,Encode方法會從結構裡面提取資料並將其編碼為JSON資料,然後把這些JSON資料寫入到檔案裡面。
相關文章
- 通過Go來分析和建立XMLGoXML
- 通過MySQL儲存原理來分析排序和鎖MySql排序
- Go語言RESTful JSON API建立GoRESTJSONAPI
- 在Go和Python之間通過ActiveMQ通訊GoPythonMQ
- 通過Go語言建立CA與簽發證書Go
- MySQL通過通用列索引來提供一個JSON列索引MySql索引JSON
- 通過了解RejectedExecutionException來分析ThreadPoolExecutor原始碼Exceptionthread原始碼
- GO語言————6.12 通過記憶體快取來提升效能Go記憶體快取
- Mybatis原始碼分析(三)通過例項來看typeHandlersMyBatis原始碼
- php 透過 JSON RPC 與 golang 通訊PHPJSONRPCGolang
- 3、Spring Cloud Rest工程建立(通過IDEA建立)SpringCloudRESTIdea
- myeclipse下通過maven建立springbootEclipseMavenSpring Boot
- json-to-goJSONGo
- 2.3 通過DBCA建立資料庫資料庫
- 1.3.2.1.2.1. 通過快照方式建立PDB
- 1.3.2.3. 通過Relocating方式建立PDB
- 通過抓包分析 HTTPSHTTP
- 使用json通過telegraf生成metrics(摘自telegraf github文件)JSONGithub
- 1.3.2.1.1. 通過種子Seed建立PDB
- 1.3.2.1. 通過克隆Cloning方式建立PDB
- Netty NioEventLoop 建立過程原始碼分析NettyOOP原始碼
- 通過分析LinkedHashMap瞭解LRUHashMap
- java通過url呼叫遠端介面返回json資料JavaJSON
- ajax與json通過程式碼的簡單應用JSON
- jmeter通過cookies來登入JMeterCookie
- 【譯】Flutter PlatformView: 如何通過原生view建立widgetFlutterPlatformView
- 通過驅動建立與MySQL的連線MySql
- Go之json資料GoJSON
- 通過Go實現AES加密和解密工具Go加密解密
- 通過原始碼分析Mybatis的功能原始碼MyBatis
- 通過信鴿來解釋 HTTPSHTTP
- 通過IO模型帶來的思考模型
- 通過外來鍵找主鍵
- 通過貝葉斯公式來評估功能難度和返工率公式
- 通過編寫指令碼和程式來擴充套件SSIS包NZ指令碼套件
- 通過 Samba 服務,建立 Linux 開發環境SambaLinux開發環境
- Idea intellij jdk 1.7通過maven建立Springboot專案IdeaIntelliJJDKMavenSpring Boot
- 圖解Flutter建立Isolate的過程及通訊圖解Flutter