Go语言标准库之JSON编解码

栏目: Go · 发布时间: 6年前

内容简介:基本的类型Go语言中的数据类型和JSON的数据类型的关系输出结果

基本的类型

Go语言中的数据类型和JSON的数据类型的关系

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

    Struct to JSON

    Go包encoding/json中的json.Marshal方法,可以将struct编码为JSON数据

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))
}

输出结果

{"Name":"Standard","Fruit":["Apple","Banana","Orange"],"ref":999,"Created":"2019-01-01T11:40:05.9885387+08:00"}
  • 只有public字段才能被导出
  • json:tag可以定义导出字段的名称
  • nil导出为null

    格式化输出

    可以使用json.MarshalIndent方法来格式化输出的JSON数据

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

格式化输出结果是

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

JSON to Struct

Go包中json.Unmarshal方法,解析 JSON数据

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)

输出结果是

Standard [Apple Banana Orange]
2019-01-01 11:45:49.0969176 +0800 CST

编码格式化任意类型的对象和数组

map[string]interface{}可以编码任意类型的 JSON对象

[]interface{}可以编码任意类型的JSON数组

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)")
        }
    }

输出结果是

Name Eve (string)
Age 6 (float64)
Parents [Alice Bob] (array)
     0 Alice
     1 Bob

编解码JSON文件

Go中encoding/json中的json.Decoder和json.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)
        }
    }

输出结果是

{"Name":"Alice"}
{"Name":"Bob"}

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2019-03/157419.htm


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

精通CSS与HTML设计模式

精通CSS与HTML设计模式

Michael Bowers / 刘申 朱瑜敏 鲁奇 / 人民邮电出版社 / 2008-9 / 69.00元

本书是一部非常实用的CSS 与HTML(XHTML)解决方案手册。书中包含了350 多种可以立即使用的设计模式(涉及文本、背景、边框、图片、表格、布局等多方面),并介绍了每种模式的原理和使用。每种设计模式、示例和源代码都经过了精心设计,易于实现和使用。通过阅读此书,可大大提高读者在 Web 设计和开发中的效率和创造力。 本书结构清晰,示例丰富,实践性强,适用于所有Web 开发和设计人员......一起来看看 《精通CSS与HTML设计模式》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具