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
Freigeben: 2024-02-10 09:00:09
nach vorne
410 Leute haben es durchsucht

无法将 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)
}
Nach dem Login kopieren

Fehler-

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

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, `"`))
}
Nach dem Login kopieren

Übrigens

assert.equal(t, 20, update.healthrange.lower)
Nach dem Login kopieren

Der Vergleich zweier verschiedener Typen sollte wie folgt korrigiert werden:

assert.Equal(t, int32(20), update.HealthRange.Lower.Int)
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage