Heim >Backend-Entwicklung >Golang >Der JSON-Bereich kann nicht in pgtype.Int4range eingelesen werden

Der JSON-Bereich kann nicht in pgtype.Int4range eingelesen werden

WBOY
WBOYnach vorne
2024-02-10 09:00:09405Durchsuche

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

Wenn der PHP-Editor Baicao PHP und die PostgreSQL-Datenbank verwendet, kann es zu einer Fehlermeldung kommen: „JSON-Bereich kann nicht als pgtype.Int4range gelesen werden“. Dieser Fehler tritt normalerweise auf, wenn versucht wird, den JSON-Datentyp in den Datentyp pgtype.Int4range zu konvertieren. Die Lösung dieses Problems ist nicht kompliziert. Sie müssen lediglich die JSON-Daten in einen String konvertieren und dann eine Datentypkonvertierung durchführen. Als nächstes werden wir detailliert beschreiben, wie dieses Problem gelöst werden kann.

Frageninhalt

Ich versuche, einen Bereich in JSON einzulesen, habe aber Probleme mit json.unmarshal.

Dies ist ein Testcode-

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)
}

Fehler-

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

Ist es möglich, es als pgtype.int4range zu lesen? Ich vermute, dass dieser Typ nur für die Datenbanknutzung gedacht ist? fwiw, ich verwende pgx github.com/jackc/pgx/v4

Workaround

Es funktioniert nicht, weil "[20,30)" 不是结构 pgtype.int4range einen gültigen JSON-Wert hat und pgtype.int4range die json.unmarshaler-Schnittstelle nicht implementiert noch.

Sie müssen die Schnittstelle zum Unmarshalieren selbst implementieren "[20,30)":

type myint4range pgtype.int4range

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

Übrigens

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

Der Vergleich zweier verschiedener Typen sollte wie folgt korrigiert werden:

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

Sehen Sie sich die vollständige Demo hier an: https://www.php.cn/link/fbf6e9ffad68f73e466198206987dedc一个>.

Das obige ist der detaillierte Inhalt vonDer JSON-Bereich kann nicht in pgtype.Int4range eingelesen werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen