golang JSON的使用

本文介绍了Golang如何使用json包进行JSON数据的编码与解码。主要涉及json.Marshal和json.Unmarshal两个函数,讲解了它们的工作原理和注意事项,包括结构体字段的大小写敏感性以及如何正确匹配JSON数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

json 是当前最常用的数据传输格式之一,纯文本,容易使用,方便阅读,在通信过程中大量被使用。

利用结构体进行转换

golang对json的解析函数在encoding/json里面,主要是编码和解码两个函数。

json.Marshal
func Marshal(v interface{}) ([]byte, error)

Marshal函数将会递归遍历整个对象,依次按成员类型对这个对象进行编码,类型转换规则如下:

Golang 数据类型JSON 数据类型
boolBoolean
int floatNumber
stringJSON String 带”“
structJSON Object 再根据成员递归打包
数组或切片JSON Array
[]bytebase64编码后的JSON String
mapJSON Object, key必须是string
interface{}按照内部实际进行转换
nilnull
channel, funcUnsupportedTypeError
package main                                                                             

import(                                                                                  
        "encoding/json"                                                                  
        "fmt"                                                                            
      )                                                                                  

type Per struct{                                                                         
    Name string                                                                          
    Position string                                                                      
}                                                                                        
func main(){                                                                             
    var p Per                                                                            
    str := `{"name":"archmage","position":"beijing"}`                                    
    err := json.Unmarshal([]byte(str),&p)                                                
    if err !=nil{                                                                        
        fmt.Println("err",err)                                                          
    }                                                                                    

    fmt.Println(p)
    fmt.Println(p.Name)
    fmt.Println(p.Position)
}
json.Unmarshal

按照上述规则对json字符串进行解析,结果放到data里面

func Unmarshal(data []byte, v interface{}) error  

示例代码

package main                                                                             

import(                                                                                  
        "encoding/json"                                                                  
        "fmt"                                                                            
      )                                                                                  

type Per struct{                                                                         
    Name string                                                                          
    Position string                                                                      
}                                                                                        
func main(){                                                                             
    var p Per                                                                            
    str := `{"name":"archmage","position":"beijing"}`                                    
    err := json.Unmarshal([]byte(str),&p)                                                
    if err !=nil{                                                                        
        fmt.Println("err",err)                                                          
    }                                                                                    

    fmt.Println(p)                                                                       
    //重新赋值后,生成新的json字符串                                                                                    
    p.Name = "archmage-json"                                                             

    b,err := json.Marshal(p)                                                             
    if err != nil{                                                                       
        fmt.Println("err 2", err)                                                       
    }                                                                                    
    fmt.Println(string(b))                                                               
}

需要注意的:golang只能将json数据解析到结构体中首字母是大写的变量中个,结构体中首字母是小写的变量,将会被忽略。json格式是大小写字母不敏感的,解析过程中,golang将自动匹配。例如上述解析过程中,结构体中的name应该为Name,而json字符串中不管是name 还是NaMe或者是nAmE,都会被解析到结构体的Name.

利用interface{} 进行转换

package main                                                                                                                                                                      

import(
        "encoding/json"
        "fmt"
      )   
func main(){
    var p map[string]interface{}
    str := `{"name":"archmage","position":"beijing","data":[{"ip":1,"num":11},{"ip":2,"num":22}]}`
    err := json.Unmarshal([]byte(str),&p)
    if err !=nil{
        fmt.Println("err",err)
    }   

    name, ok := p["name"].(string)
    if !ok {
        fmt.Println("can not resolve name", err)
    }   
    position, ok := p["position"].(string)
    if !ok {
        fmt.Println("can not resolve position", err)
    }   
    fmt.Println("name:",name)
    fmt.Println("position:",position)

    data,ok := p["data"].([]interface{})
    if !ok {
        fmt.Println("can not resolve data",err)
        return
    }   

    for i,idata := range data{
        d, ok := idata.(map[string]interface{})
        if !ok {
            fmt.Println(err)
            continue
        }
        fmt.Println("第",i,"组数据")
        fmt.Println("ip:",d["ip"].(float64))
        fmt.Println("num:", d["num"].(float64))
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值