1. ERROR: json: cannot unmarshal array into Go struct field
解决办法
package main
import (
"encoding/json"
"log"
)
var body_byte = []byte(`{
"status": true,
"data": {
"ModelList": [{
"Id": 1,
"Name": "foo",
"CarId": 1,
"EngName": "bar"
},{
"Id": 2,
"Name": "boo",
"CarId": 2,
"EngName": "Mojito"
}]
}
}`)
type MyAjaxModelsList struct {
Id float64 `json:"Id"`
Name string `json:"Name"`
CarId float64 `json:"CarId"`
EngName string `json:"EngName"`
}
type MyAjaxModels struct {
Status bool `json:"status"`
Data map[string][]MyAjaxModelsList `json:"data"`
}
func main() {
c := MyAjaxModels{}
if err := json.Unmarshal(body_byte, &c); err != nil {
log.Fatalf("an error occured: %v", err)
}
log.Println(c)
}
2.从本地读写
Q1:annot convert type struct to type string
Q2:如果拿到的结果格式是
[{1 foo 1 bar} {2 zoo 2 kkk}]
希望得到结果
[{"CarId":1,"EngName":"bar","Id":1,"Name":"foo"},{"CarId":2,"EngName":"kkk","Id":2,"Name":"zoo"}]
需要重写方法 MarshalJSON
代码如下
package main
import (
"encoding/json"
"fmt"
"github.com/astaxie/beego"
"io/ioutil"
"os"
)
func main() {
//var c MyContact
var content []byte
var err error
content, err = fileGetContents("tests/jsonTestDir/Ajax.json")
if err != nil {
fmt.Println("open file error: "+ err.Error())
return
}
ajax :=AjaxModels{}
if err := json.Unmarshal(content,&ajax); err != nil {
beego.Info("an error occured: %v",err)
}
for _,ajaxModel:=range ajax.Data{
fmt.Println(ajaxModel) // [{1 foo 1 bar} {2 zoo 2 kkk}]
myAjaxModel, _ := json.Marshal(ajaxModel)
fmt.Println(string(myAjaxModel)) // [{"CarId":1,"EngName":"bar","Id":1,"Name":"foo"},{"CarId":2,"EngName":"kkk","Id":2,"Name":"zoo"}]
}
beego.Info(ajax.Status)
}
func (ajaxModelsList AjaxModelsList) MarshalJSON() ([]byte, error) {
return json.Marshal(map[string]interface{}{
"Name":ajaxModelsList.Name,
"CarId":ajaxModelsList.CarId,
"EngName":ajaxModelsList.EngName,
"Id":ajaxModelsList.Id,
})
}
func fileGetContents(path string) ([]byte, error) {
f, err := os.Open(path)
if err != nil {
return nil, err
}
return ioutil.ReadAll(f)
}
type AjaxModels struct {
Status bool `json:"status"`
Data map[string][]AjaxModelsList `json:"data"`
}
type AjaxModelsList struct {
Id float64 `json:"Id"`
Name string `json:"Name"`
CarId float64 `json:"CarId"`
EngName string `json:"EngName"`
}
Ajax.json
{
"status": true,
"data": {
"ModelList": [{
"Id": 1,
"Name": "foo",
"CarId": 1,
"EngName": "bar"
},{
"Id": 2,
"Name": "zoo",
"CarId": 2,
"EngName": "mojito"
}]
}
}