gorm 寫入json文本


gorm 結構

type Thgl struct {
	Model
	Code     string    `gorm:"size(10);index:pre_idx" json:"code"`
	Next     MyJson    `json:"next"`  //子Bom
	Files    MyJson    `json:"files"` //文件
	Glass    MyJson    `json:"glass"` //玻璃參數 ->價格
}

//增加圖號
func AddThgl(data map[string]interface{}, name string) (int, error) {
	str := Thgl{
		Code:     data["code"].(string),
		Next:     MyJson{data["next"]},
		Files:    MyJson{data["files"]},
		Glass:    MyJson{data["glass"]},
	}
	err := db.Create(&str).Error
	return str.ID, err
}

//更改圖號
func EditThgl(data map[string]interface{}) error {
	data["next"] = MyJson{data["next"]}
	data["files"] = MyJson{data["files"]}
	data["glass"] = MyJson{data["glass"]}
	err := db.Model(&Thgl{}).Updates(data).Error
	return err
}  

創建自定義類型

type MyJson struct {
	v interface{}
}

// 寫入數據庫之前,對數據做類型轉換
func (s MyJson) Value() (driver.Value, error) {
	b, err := json.Marshal(s.v)
	return string(b), err
}

// 將數據庫中取出的數據,賦值給目標類型
func (s *MyJson) Scan(v interface{}) error {
	var err error
	var data_ map[string]interface{}
	var data []map[string]interface{}
	fmt.Println(v, string(v.([]byte)))
	switch vt := v.(type) {
	case string:
		err = json.Unmarshal([]byte(vt), &s.v)
	case []byte:
		if vt[0] == 91 {
			err = json.Unmarshal(vt, &data)
			*s = MyJson{data}
			//s.v = data
		} else {
			err = json.Unmarshal(vt, &data_)
			//s.v = data_
			*s = MyJson{data_}
		}
	default:
		return errors.New("myjson 轉換錯誤")
	}
	return err
}

// 自定義類型上實現 Marshaler 的接口, 在進行 Marshal 時就會使用此除的實現來進行 json 編碼
func (s MyJson) MarshalJSON() ([]byte, error) {
        // 可以自由調整精度
//if float64(f) == float64(int(f)) {
	//	return []byte(strconv.FormatFloat(float64(f), 'f', 2, 64)), nil 
	//}
	//return []byte(strconv.FormatFloat(float64(f), 'f', -1, 64)), nil*/

	b, err := json.Marshal(s.v)
	fmt.Println(b, string(b))
	return b, err
}

/*
func (t *MyJson) UnmarshalJSON(b []byte) error {
	b = bytes.Trim(b, "\"")
	ext, err := time.Parse(t.UnmarshalTimeFormat(), string(b))
	if err != nil {
		// do something
	}
	*t = ExTime{ext}
	return nil
}
*/

  初學go,請多多指教


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM