Go語言標(biāo)準(zhǔn)庫之JSON編解碼

Go語言標(biāo)準(zhǔn)庫之JSON編解碼

基本的類型

Go語言中的數(shù)據(jù)類型和JSON的數(shù)據(jù)類型的關(guān)系

  • bool -> JSON boolean
  • float64 -> JSON numbers
  • string -> JSON strings
  • nil -> JSON null
Struct to JSON

Goencoding/json中的json.Marshal方法,可以將struct編碼為JSON數(shù)據(jù)

package main

import (
    "encoding/json"
    "fmt"
    "time"
)

type FruitBasket struct {
    Name    string
    Fruit   []string
    Id      int64  `json:"ref"`
    private string // 這個字段不會被編碼
    Created time.Time
}

func main() {
    basket := FruitBasket{
        Name:    "Standard",
        Fruit:   []string{"Apple", "Banana", "Orange"},
        Id:      999,
        private: "Second-rate",
        Created: time.Now(),
    }

    jsonData, err := json.Marshal(basket)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(jsonData))
}

輸出結(jié)果

{"Name":"Standard","Fruit":["Apple","Banana","Orange"],"ref":999,"Created":"2019-01-01T11:40:05.9885387+08:00"}
  • 只有public字段才能被導(dǎo)出
  • json:tag可以定義導(dǎo)出字段的名稱
  • nil導(dǎo)出為null
格式化輸出

可以使用json.MarshalIndent方法來格式化輸出的JSON數(shù)據(jù)

 formatData, err := json.MarshalIndent(basket, "", "    ")
fmt.Println(string(formatData))

格式化輸出結(jié)果是

{
    "Name": "Standard",
    "Fruit": [
        "Apple",
        "Banana",
        "Orange"
    ],
    "ref": 999,
    "Created": "2019-01-01T11:45:49.0969176+08:00"
}
JSON to Struct

Go包中json.Unmarshal方法,解析 JSON數(shù)據(jù)

  jsonStr := []byte(`
    {
        "Name": "Standard",
        "Fruit": [
            "Apple",
            "Banana",
            "Orange"
        ],
        "ref": 999,
        "Created": "2019-01-01T11:45:49.0969176+08:00"
    }
    `)

    var basketStruct FruitBasket
    err = json.Unmarshal(jsonStr, &basketStruct)
    if err != nil {
        log.Println(err)
    }
    fmt.Println(basketStruct.Name, basketStruct.Fruit)
    fmt.Println(basketStruct.Created)

輸出結(jié)果是

Standard [Apple Banana Orange]
2019-01-01 11:45:49.0969176 +0800 CST
編碼格式化任意類型的對象和數(shù)組

map[string]interface{}可以編碼任意類型的 JSON對象
[]interface{}可以編碼任意類型的JSON數(shù)組

 arbitData := []byte(`{"Name":"Eve","Age":6,"Parents":["Alice","Bob"]}`)
    var v interface{}
    err = json.Unmarshal(arbitData, &v)
    if err != nil {
        log.Println(err)
    }
    data := v.(map[string]interface{})
    for k, v := range data {
        switch v := v.(type) {
        case string:
            fmt.Println(k, v, "(string)")
        case float64:
            fmt.Println(k, v, "(float64)")
        case []interface{}:
            fmt.Println(k, v, "(array)")
            for i, u := range v {
                fmt.Println("    ", i, u)
            }
        default:
            fmt.Println(k, v, "(unknown)")
        }
    }

輸出結(jié)果是

Name Eve (string)
Age 6 (float64)
Parents [Alice Bob] (array)
     0 Alice
     1 Bob
編解碼JSON文件

Goencoding/json中的json.Decoderjson.Encoder方法可以編解碼JSON格式文件

例子:

   jsonstr := `
    {"Name": "Alice", "Age": 25}
    {"Name": "Bob", "Age": 22}`
    reader := strings.NewReader(jsonstr)
    writer := os.Stdout

    dec := json.NewDecoder(reader)
    enc := json.NewEncoder(writer)

    for {
        var m map[string]interface{}
        if err := dec.Decode(&m); err == io.EOF {
            break
        } else if err != nil {
            log.Fatal(err)
        }

        for k := range m {
            if k == "Age" {
                delete(m, k)
            }
        }

        if err = enc.Encode(&m); err != nil {
            log.Println(err)
        }
    }

輸出結(jié)果是

{"Name":"Alice"}
{"Name":"Bob"}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容