首頁  >  文章  >  後端開發  >  無法將 json 範圍讀取為 pgtype.Int4range

無法將 json 範圍讀取為 pgtype.Int4range

WBOY
WBOY轉載
2024-02-10 09:00:09378瀏覽

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

php小編百草在使用PHP與PostgreSQL資料庫時,可能會遇到一個錯誤提示:「無法將 json 範圍讀取為 pgtype.Int4range」。這個錯誤通常發生在嘗試將JSON資料型別轉換為pgtype.Int4range資料型別時。這個問題的解決方法並不複雜,只需要將JSON資料轉換為字串,然後再進行資料類型轉換。接下來,我們將詳細介紹如何解決這個問題。

問題內容

我正在嘗試將範圍讀取為 json,但在執行 json.unmarshal 時遇到問題。

這是一個測試程式碼-

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

錯誤-

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

是否可以將其讀取為 pgtype.int4range?我猜這種類型僅供資料庫使用? fwiw,我正在使用pgx github.com/jackc/pgx/v4

解決方法

它不起作用,因為"[20,30)" 不是結構pgtype.int4range 的有效json 值,且pgtype.int4range 尚未實作json.unmarshaler 介面。

您必須自己實作介面來解組 "[20,30)":

type myint4range pgtype.int4range

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

順便說一句

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

比較兩種不同的類型,應更正為:

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

在此處查看完整演示:https://www.php.cn/link/fbf6e9ffad68f73e466198206987dedc一个>.

以上是無法將 json 範圍讀取為 pgtype.Int4range的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除