go语言使用json

1 篇文章 0 订阅

go语言使用json

参考 https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/07.2.md

解析json

import (
    "fmt"
    "github.com/bitly/go-simplejson"
    "encoding/json"
    "github.com/bitly/go-simplejson"
)

type Server struct {
    ServerName string `json:"server_name"`
    ServerIP   string    `json:"server_ip"`
}

type Serverslice struct {
    Servers []Server
}

func main() {
    var s Serverslice
    str := `{"servers":[{"server_name":"Shanghai_VPN","server_ip":"127.0.0.1"},{"server_name":"Beijing_VPN","server_ip":"127.0.0.2"}]}`
    json.Unmarshal([]byte(str), &s)
    fmt.Println("range...")
    for _, v2 := range s.Servers {
        fmt.Println(v2.ServerName)
        fmt.Println(v2.ServerIP)
    }
    fmt.Println("for...")
    for i:=0;i<len(s.Servers);i++ {
        fmt.Println(s.Servers[i].ServerName)
        fmt.Println(s.Servers[i].ServerIP)
    }

    // 使用第三方库github.com/bitly/go-simplejson 实现
    js, err := simplejson.NewJson([]byte(`{
        "test": {
            "array": [1, "2", 3],
            "int": 10,
            "float": 5.150,
            "bignum": 9223372036854775807,
            "string": "simplejson",
            "bool": true
        }
    }`))
    arr, _ := js.Get("test").Get("array").Array()
    i, _ := js.Get("test").Get("int").Int()
    ms := js.Get("test").Get("string").MustString()
    if err == nil {
        fmt.Println(arr)
        fmt.Println(i)
        fmt.Println(ms)
    }
}

如何将json数据与struct字段相匹配呢?例如JSON的key是Foo,那么怎么找对应的字段呢?
1.首先查找tag含有Foo的可导出的struct字段(首字母大写)
2.其次查找字段名是Foo的导出字段
3.最后查找类似FOO或者FoO这样的除了首字母之外其他大小写不敏感的导出字段

JSON解析的时候只会解析能找得到的字段,找不到的字段会被忽略,这样的一个好处是:当你接收到一个很大的JSON数据结构而你却只想获取其中的部分数据的时候,你只需将你想要的数据对应的字段名大写,即可轻松解决这个问题

JSON包中采用map[string]interface{}和[]interface{}结构来存储任意的JSON对象和数组。Go类型和JSON类型的对应关系如下:

bool 代表 JSON booleans,
float64 代表 JSON numbers,
string 代表 JSON strings,
nil 代表 JSON null.

生成json

import (
    "encoding/json"
    "os"
)
type Server struct {
    // ID 不会导出到JSON中
    ID          int `json:"-"`

    // ServerName2 的值会进行二次JSON编码
    ServerName  string `json:"serverName"`
    ServerName2 string `json:"serverName2,string"`

    // 如果 ServerIP 为空,则不输出到JSON串中
    ServerIP    string `json:"serverIP,omitempty"`
}

func main() {
    s := Server {
        ID:         3,
        ServerName:  `Go "1.0" `,
        ServerName2: `Go "1.0" `,
        ServerIP:   ``,
    }
    b, _ := json.Marshal(s)
    os.Stdout.Write(b)
}

字段的tag是”-“,那么这个字段不会输出到JSON
tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中,例如上面例子中serverName
tag中如果带有”omitempty”选项,那么如果该字段值为空,就不会输出到JSON串中
如果字段类型是bool, string, int, int64等,而tag中带有”,string”选项,那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值