Heim >Backend-Entwicklung >Golang >Der JSON-Bereich kann nicht in pgtype.Int4range eingelesen werden
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.
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
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!