golang读写json

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"
    }]
  }
}

你可能感兴趣的:(golang)