Go 使用Unmarshal將json賦給struct出錯(cuò)的原因及解決
例如:
將json:
{
"name": "Laura"
"age": "18"
}
賦給struct:
type PersonalInfo struct {
Name string `json:"name"`
Age string `json:"age"`
}
用語(yǔ)句:
person := PersonalInfo{}
err := json.Unmarshal(json, &persona)//json為上面的[]byte
出錯(cuò)原因:
1、struct中變量名是不可導(dǎo)出的(首寫字母是小寫的),需要把首寫字母改成大寫
2、需要傳輸person的指針
3、struct中json的名字與json中的名字需要一模一樣
補(bǔ)充:Go語(yǔ)言處理JSON之——利用Unmarshal解析json字符串
簡(jiǎn)單的解析例子:
首先還是從官方文檔中的例子:
package main
import (
"fmt"
"encoding/json"
)
type Animal struct {
Name string
Order string
}
func main() {
var jsonBlob = []byte(`[
{"Name": "Platypus", "Order": "Monotremata"},
{"Name": "Quoll", "Order": "Dasyuromorphia"}
]`)
var animals []Animal
err := json.Unmarshal(jsonBlob, &animals)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v", animals)
}
輸出:
[{Name:Platypus Order:Monotremata} {Name:Quoll Order:Dasyuromorphia}]
簡(jiǎn)單進(jìn)行修改,修改為:
package main
import (
"fmt"
"encoding/json"
)
type Animal struct {
Name string
Order string
}
func main() {
var jsonBlob = []byte(`{"Name": "Platypus", "Order": "Monotremata"}`)
var animals Animal
err := json.Unmarshal(jsonBlob, &animals)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v", animals)
}
輸出:
{Name:Platypus Order:Monotremata}
還是之前的例子:
解析這樣的一個(gè)json字符串:
{
"first fruit":
{
"describe":"an apple",
"icon":"appleIcon",
"name":"apple"
},
"second fruit":
{
"describe":"an orange",
"icon":"orangeIcon",
"name":"orange"
},
"three fruit array":
[
"eat 0",
"eat 1",
"eat 2",
"eat 3",
"eat 4"
]
}
go代碼:
package main
import (
"fmt"
"encoding/json"
)
type Fruit struct {
Describe string `json:"describe"`
Icon string `json:"icon"`
Name string `json:"name"`
}
type FruitGroup struct {
FirstFruit *Fruit `json:"first fruit"` //指針,指向引用對(duì)象;如果不用指針,只是值復(fù)制
SecondFruit *Fruit `json:"second fruit"` //指針,指向引用對(duì)象;如果不用指針,只是值復(fù)制
THreeFruitArray []string `json:"three fruit array"`
}
func main() {
var jsonBlob = []byte(`{
"first fruit": {
"describe": "an apple",
"icon": "appleIcon",
"name": "apple"
},
"second fruit": {
"describe": "an orange",
"icon": "appleIcon",
"name": "orange"
},
"three fruit array": [
"eat 0",
"eat 1",
"eat 2",
"eat 3"
]}`)
var fruitGroup FruitGroup
err := json.Unmarshal(jsonBlob, &fruitGroup)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v\n", fruitGroup)
fmt.Printf("%+v\n", fruitGroup.FirstFruit)
fmt.Printf("%+v\n", fruitGroup.SecondFruit)
}
運(yùn)行結(jié)果:
{FirstFruit:0xc00006c5a0 SecondFruit:0xc00006c5d0 THreeFruitArray:[eat 0 eat 1 eat 2 eat 3]}
&{Describe:an apple Icon:appleIcon Name:apple}
&{Describe:an orange Icon:appleIcon Name:orange}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
go中結(jié)構(gòu)體切片的實(shí)現(xiàn)示例
Go語(yǔ)言中的結(jié)構(gòu)體切片是一種結(jié)合了結(jié)構(gòu)體和切片特點(diǎn)的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)和操作多個(gè)結(jié)構(gòu)體實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-11-11
Go 語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之雙鏈表學(xué)習(xí)教程
這篇文章主要為大家介紹了Go 語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之雙鏈表學(xué)習(xí)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
通過手機(jī)案例理解Go設(shè)計(jì)模式之裝飾器模式的功能屬性
這篇文章主要為大家介紹了Go設(shè)計(jì)模式之裝飾器模式的功能屬性,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Golang環(huán)境變量設(shè)置和查看工具go env詳解
go env 是 Go 工具鏈中的一個(gè)命令,用于設(shè)置和查看當(dāng)前 Golang 環(huán)境的相關(guān)信息,對(duì)于理解、編譯和運(yùn)行 Golang 程序非常有用,本文就給大家簡(jiǎn)單的介紹一下Golang環(huán)境變量設(shè)置和查看工具go env,需要的朋友可以參考下2023-07-07
golang 實(shí)現(xiàn)tcp轉(zhuǎn)發(fā)代理的方法
今天小編就為大家分享一篇golang 實(shí)現(xiàn)tcp轉(zhuǎn)發(fā)代理的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Golang使用原生http實(shí)現(xiàn)中間件的代碼詳解
中間件(middleware):常被用來做認(rèn)證校驗(yàn)、審計(jì)等,家常用的Iris、Gin等web框架,都包含了中間件邏輯,但有時(shí)我們引入該框架顯得較為繁重,本文將介紹通過golang原生http來實(shí)現(xiàn)中間件操作,需要的朋友可以參考下2024-05-05

