Maison > développement back-end > Golang > Impossible de lire la plage json dans pgtype.Int4range

Impossible de lire la plage json dans pgtype.Int4range

WBOY
Libérer: 2024-02-10 09:00:09
avant
423 Les gens l'ont consulté

无法将 json 范围读取为 pgtype.Int4range

L'éditeur php Baicao peut rencontrer un message d'erreur lors de l'utilisation de la base de données PHP et PostgreSQL : "Impossible de lire la plage json en tant que pgtype.Int4range". Cette erreur se produit généralement lors de la tentative de conversion du type de données JSON en type de données pgtype.Int4range. La solution à ce problème n'est pas compliquée. Il vous suffit de convertir les données JSON en chaîne, puis d'effectuer une conversion de type de données. Nous détaillerons ensuite comment résoudre ce problème.

Contenu de la question

J'essaie de lire une plage dans json mais j'ai du mal à faire json.unmarshal.

Ceci est un code de test-

import (
    "encoding/json"
    "testing"

    "github.com/jackc/pgtype"
    "github.com/stretchr/testify/assert"
)

type testhealthpreference struct {
    healthrange pgtype.int4range `json:"health_range"`
    id          string           `json:"id"`
}

// just a test to make sure unmarshaling works
func testpreferenceupdateunmarshal(t *testing.t) {
    jsondata := `{
        "health_range": "[20,30)",
        "id": "123"
    }`

    var update testhealthpreference
    err := json.unmarshal([]byte(jsondata), &update)
    if err != nil {
        t.errorf("error while unmarshalling json: %v", err)
    }

    assert.equal(t, 20, update.healthrange.lower)
}
Copier après la connexion

Erreur-

Error while unmarshalling JSON: json: cannot unmarshal string into Go struct field TestPreference.health_range of type pgtype.Int4range.
Copier après la connexion

Est-il possible de le lire sous la forme pgtype.int4range ? Je suppose que ce type est uniquement destiné à la base de données ? fwiw, j'utilise pgx github.com/jackc/pgx/v4

Workaround

Cela ne fonctionne pas car "[20,30)" 不是结构 pgtype.int4range a une valeur json valide et pgtype.int4range n'implémente pas l'interface json.unmarshaler encore.

Vous devez implémenter vous-même l'interface pour désorganiser "[20,30)" :

type myint4range pgtype.int4range

func (r *myint4range) unmarshaljson(b []byte) error {
    return (*pgtype.int4range)(r).decodetext(nil, bytes.trim(b, `"`))
}
Copier après la connexion

Au fait

assert.equal(t, 20, update.healthrange.lower)
Copier après la connexion

En comparant deux types différents, doit être corrigé comme suit :

assert.Equal(t, int32(20), update.HealthRange.Lower.Int)
Copier après la connexion

Voir la démo complète ici : //m.sbmmt.com/link/fbf6e9ffad68f73e466198206987dedc一个>.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal