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

Impossible de lire la plage json dans pgtype.Int4range

WBOY
WBOYavant
2024-02-10 09:00:09378parcourir

无法将 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)
}

Erreur-

Error while unmarshalling JSON: json: cannot unmarshal string into Go struct field TestPreference.health_range of type pgtype.Int4range.

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, `"`))
}

Au fait

assert.equal(t, 20, update.healthrange.lower)

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

assert.Equal(t, int32(20), update.HealthRange.Lower.Int)

Voir la démo complète ici : https://www.php.cn/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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer