1. 程式人生 > 程式設計 >Golang 如何解析和生成json

Golang 如何解析和生成json

JSON(Javascript Object Notation)是一種輕量級的資料交換語言,以文字為基礎,具有自我描述性且易於讓人閱讀。儘管JSON是JavaScript的一個子集,但JSON是獨立於語言的文字格式,並且採用了類似於C語言家族的一些習慣。JSON與XML最大的不同在於XML是一個完整的標記語言,而JSON不是。JSON由於比XML更小、更快,更易解析,以及瀏覽器的內建快速解析支援,使得其更適用於網路資料傳輸領域。

Golang自帶的JSON解析庫encoding/json,可以用起將結構化資料序列化成json字串或從json字串中解析出我們想要的資料。

1.解析json

給一個較為複雜的json字串,包含陣列,陣列的元素是json物件。我們需要取出陣列第一個元素中的某一個欄位值。其它的解析均可參考下面的程式碼。

package main

import (
  "encoding/json"
  "fmt"
)

func main() {
    jsonStr := []byte(`{"uin":1589276509,"feedID":10000,"videos":[{"picture":"http://qqpublic.qpic.cn/avatar.jpg","duration":"839"}]}`)
    var jsonMap map[string]interface{}
    if err := json.Unmarshal(jsonStr,&jsonMap); err!=nil {
      fmt.Printf("json decode failed,err=%v",err)
      return
    }
    value,ok:=jsonMap["videos"]
    fmt.Printf("value=%#v\n",value)
    if ok {
        sliceValue,ok := value.([]interface{})
        if ok {
            mapValue,ok := sliceValue[0].(map[string]interface{})
            if ok {
                duration,ok := mapValue["duration"]
                if ok {
                    fmt.Printf("d=%v,type=%T\n",duration,duration)
                }
            }
        }
    }
}

程式輸出:

value=[]interface {}{map[string]interface {}{"picture":"http://qqpublic.qpic.cn/avatar.jpg","duration":"839"}}
d=839,type=string

解析json字串時,需要注意如下幾點:
(1)Go型別和JSON型別的對應關係如下:

map[string]interface{}代表JSON物件
[]interface{}代表JSON陣列
bool代表JSON booleans
float64代表JSON numbers
string代表JSON strings
nil 代表JSON null

2.生成json

假設我們有如下一個類(結構體)student 及其一個例項物件st,將其序列化為json,具體實現如下:

package main

import (
  "encoding/json"
  "fmt"
)

type Stu struct {
  Name string `json:"name"`
  Age  int
  sex  string
  Class *Class `json:"class"`
}

type Class struct {
  Name string
  Grade int
}

func main() {
//例項化一個數據結構,用於生成json字串
  stu := Stu{
    Name: "張三",Age: 18,sex: "男",}

  //指標變數
  cla := new(Class)
  cla.Name = "1班"
  cla.Grade = 3
  stu.Class=cla

  //Marshal失敗時err!=nil
  jsonStu,err := json.Marshal(stu)
  if err != nil {
    fmt.Println("生成json字串錯誤")
  }

  //jsonStu是[]byte型別,轉化成string型別便於檢視
  fmt.Println(string(jsonStu))
}

程式輸出結果:

{"name":"張三","Age":18,"class":{"Name":"1班","Grade":3}}

閱讀以上程式碼可以看出:

(1)只要是可匯出成員(變數首字母大寫),都可以轉成json。因成員變數sex是不可匯出的,故無法轉成json;

(2)如果變數打上了json標籤,如Name旁邊的 json:"name" ,那麼轉化成的json key就用該標籤“name”,否則取欄位名作為key,如"Age";

(3)指標變數,編碼時自動轉換為它所指向的值,如Class變數;

(4)強調一句,序列化成功後的json字串是純粹的字串。

以上就是Golang 如何解析和生成json的詳細內容,更多關於golang 解析、生成json的資料請關注我們其它相關文章!