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,请多多指教

posted @ 2020-05-20 21:35  一大二王里  阅读(2982)  评论(0编辑  收藏  举报