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

bxpogfeg  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(115)

我尝试将一个范围读取为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

ff29svar

ff29svar1#

它不起作用,因为"[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, `"`))
}

字符串
BTW

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


比较两种不同类型,应更正为:

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


查看完整的demo:https://go.dev/play/p/gGNj3kOBB8k的数据。

相关问题