Tengo un objeto json enviado desde una aplicación móvil, se ve así:
{ "product_id": "0123456789", "name": "PRODUCT_NAME", "manufacturer": "PRODUCT_MANUFACTURER", "image_url": "IMAGE_URL", "additional_info": "", "store_id": "STORE_ID", "store_name": "STORE_NAME", "owner_id": "OWNER_ID", "quantities": { "1000": 10.0, "1500": 12.0, } } El valor clave en quantities es, por ejemplo, pueden ser gramos, y el valor es a representa un precio. Entonces, por ejemplo, 1000 gramos de arroz costarán 10 $ y 1500 gramos de arroz costarán 12,0 $ (como venta o algo así)
Tengo un objeto de modelo en mi código Go , que tiene las quantities archivadas como map[int]float32 . Estoy tratando de encontrar una forma de insertar este mapa en una base de datos PostgreSQL que tengo, pero no sé cómo.
Este es mi modelo Go :
type Product struct { ID string UUID string Name string Manufacturer string ImageURL string AdditionalInfo string StoreID string StoreName string OwnerID string Quantities map[int]float32 } Leí sobre JSONB , pero ¿no devolverá un json cuando recupere los datos? Lo necesito para devolver un map[int]float32 y no json .
Debe implementar la interfaz driver.Valuer y sql.Scanner para guardar como JSONB
La interfaz driver.Valuer , de modo que ordena el objeto en un segmento de bytes JSON que la base de datos puede entender.
La interfaz sql.Scanner , de modo que separa un segmento de bytes JSON de la base de datos en los campos de estructura.
Y para json Marshal necesitas convertir map[int]float32 en map[string]float32
type cusjsonb map[int]float32 // Returns the JSON-encoded representation func (a cusjsonb) Value() (driver.Value, error) { // Convert to map[string]float32 from map[int]float32 x := make(map[string]float32) for k, v := range a { x[strconv.FormatInt(int64(k), 10)] = v } // Marshal into json return json.Marshal(x) } // Decodes a JSON-encoded value func (a *cusjsonb) Scan(value interface{}) error { b, ok := value.([]byte) if !ok { return errors.New("type assertion to []byte failed") } // Unmarshal from json to map[string]float32 x := make(map[string]float32) if err := json.Unmarshal(b, &x); err != nil { return err } // Convert to map[int]float32 from map[string]float32 *a = make(cusjsonb, len(x)) for k, v := range x { if ki, err := strconv.ParseInt(k, 10, 32); err != nil { return err } else { (*a)[int(ki)] = v } } return nil }