阅读 842

Go的JSON解析

JSON

JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在今天占据了很大的市场,虽然序列化和反序列化的性能不足,但是其可读性良好,在性能追求不是很高的情况下是个很不错的选择。

标签

默认情况下,进行序列化和反序列化的时候,标准库都会认为字段名和JSON的键具有一一对应的关系,而Go语言的字段一般采用驼峰命名法,JSON中比较常用下划线的方式,所以使用标签来建立映射是很方便的一种方式

type Student struct {
    Name string `json:"name,omitempty"`
    Age int32 `json:"age,string,omitempty"`
}
复制代码

常用的两个标签是omitemptystring

  • omitempty表示字段为零值时,直接在生成的JSON中忽略对应的键值对
  • string表示当前的整数或者浮点数是由JSON中的字符串表示的

JSON转成struct结构

JSON转成struct结构,可以使用在线工具,就不用自己手写。只需要将json贴到左边就可以生成struct了

解析简单JSON

package main

import (
    "encoding/json"
    "fmt"
)

//定义结构体
type Instance struct {
    Cpu             int  `json:"cpu"`
    CaxPacketSizeMB int  `json:"caxPacketSizeMB"`
    Pprof           int  `json:"pprof"`
    Metrics         bool `json:"metrics"`
}

func main() {
    jsonData := []byte(`
    {
    	"cpu": 10,
    	"maxPacketSizeMB": 12,
    	"pprof": 8886,
    	"metrics": true
    }`)
    
    //初始化一个结构体
    var instance Instance
    //解析jsonData -> instance
    err := json.Unmarshal(jsonData, &instance)
    if err != nil {
    	fmt.Println(err)
    }
    
    fmt.Println(instance.Cpu, instance.CaxPacketSizeMB, instance.Metrics, instance.Pprof)
}
复制代码

结果

  • 由于json.Unmarshal()接收的是字节切片,所以先要把JSON字符串转换成字节切片c := []byte(s)
  • 注意代码中JSON数据两侧加的``不是单引号,是撇号。如果没有撇号,json字符中的"引号,需用\进行转义,否则编译出错

弱类型解析

弱类型解析一般适用于:

  • json格式的数据类型不确定
  • json格式的数据result中参数不固定 解决方法是使用一个开源库
type MobileInfo struct {
    Resultcode string `json:"resultcode"`
} 

func main() {
    //json数据
    jsonStr := `
    	{
    		"resultcode": 200
    	}
    `
    
    var result map[string]interface{}
    
    //解析到result
    err := json.Unmarshal([]byte(jsonStr), &result)
    if err != nil {
    	fmt.Println(err)
    }
    fmt.Println(result)
    
    //转换成结构体
    var mobile MobileInfo
    err = mapstructure.WeakDecode(result, &mobile)
    if err != nil {
    	fmt.Println(err)
    }
    
    fmt.Println(mobile.Resultcode)
}
复制代码

结果

文章分类
后端
文章标签