the*_*ory 1 reflection json marshalling go slice
我想要使用base64 RawURLEncoding而不是.json 来编组和解组 JSON 的字节切片StdEncoding。没有明显的方法可以通过编码/json包来做到这一点,这是明智的,所以我想我应该创建一个子类型来做到这一点。
type Thing []byte
Run Code Online (Sandbox Code Playgroud)
编组支持很简单:
func (thing Thing) MarshalJSON() ([]byte, error) {
if thing == nil {
return []byte("null"), nil
}
return []byte(`"` + base64.RawURLEncoding.EncodeToString(thing) + `"`), nil
}
Run Code Online (Sandbox Code Playgroud)
但 Unmarshal 却没有那么多。我追踪了编码/json源,并提出了:
func (thing Thing) UnmarshalJSON(data []byte) error {
v := reflect.ValueOf(&thing)
if len(data) == 0 || data[0] == 'n' { // null
v.SetBytes([]byte{})
return nil
}
data = data[1 : len(data)-1]
dst := make([]byte, base64.RawURLEncoding.DecodedLen(len(data)))
n, err := base64.RawURLEncoding.Decode(dst, data)
if err != nil {
return err
}
v.SetBytes(Thing(dst[:n]))
return nil
}
Run Code Online (Sandbox Code Playgroud)
但在调用时会产生恐慌SetBytes():
panic: reflect: reflect.Value.SetBytes using unaddressable value [recovered]
panic: reflect: reflect.Value.SetBytes using unaddressable value
Run Code Online (Sandbox Code Playgroud)
我尝试使用指向切片的指针,它可以工作(并且不需要反射),但会在我的代码中的其他地方导致其他挑战,这些挑战需要使用切片而不是指针。
所以我想有两个问题:
RawURLEncoding?RawURLEncoding格式解码的数据?使用此代码来解组该值:
func (thing *Thing) UnmarshalJSON(data []byte) error {
if len(data) == 0 || data[0] == 'n' { // copied from the Q, can be improved
*thing = nil
return nil
}
data = data[1 : len(data)-1]
dst := make([]byte, base64.RawURLEncoding.DecodedLen(len(data)))
n, err := base64.RawURLEncoding.Decode(dst, data)
if err != nil {
return err
}
*thing = dst[:n]
return nil
}
Run Code Online (Sandbox Code Playgroud)
要点:
| 归档时间: |
|
| 查看次数: |
872 次 |
| 最近记录: |