我正在尝试使用泛型将 JSON 对象转换为具有枚举的 GRPC 响应,即:
type GRPCResponse {
str string
enu EnumType
}
type EnumType int32
const (
Type1 EnumType = 0
Type2 EnumType = 1
)
解组函数如下所示:
func assertHTTPResponseOK[T any](t *testing.T, endpoint string) T {
body, err := GetResponse(endpoint)
var v T
err := json.Unmarshal(body, &v)
require.Nil(t, err)
return v
}
调用它的代码如下所示:
assertHTTPResponseOK[*GRPCResponse](t, "some-endpoint")
有问题的 JSON 对象如下所示:
{"str":"hello", "enu": "Type2"}
我收到以下错误:
json: cannot unmarshal string into Go struct field GRPCResponse.enu of type EnumType
从类似的问题中,我看到通常的建议是使用jsonpb.Unmarshalorprotojson.Unmarshal而不是典型的json.Unmarshal.
在更改 Unmarshal 函数时,我还必须将 T 更改为protoreflect.ProtoMessage. 但是,这会阻止我将指针传递v给Unmarshal,因为它是指向接口的指针,而不是接口。当然我也不能传入一个nil指针(不取v的地址)。
所以我的问题是:
有没有办法让这个通用对象的指针满足接口protoreflect.ProtoMessage?
是否有更好的 Unmarshalling 函数更适合我的问题?
慕丝7291255
ITMISS
相关分类