我有一个protobuf消息
message Event {
string type = 1;
string names = 2;
}
' names '的类型最近从底层数据源中的string
更改为[]string
,其中旧数据仍然是字符串,但新数据将是[]字符串。因此,当返回数据时,一些记录可以是string,而其他记录可以是[]string。我需要自定义数据编组(jsonpb)。解组器被用来解组json。Rawmessage到Event类型),并将' names '转换为字符串,如果它是[]字符串(通过连接数组/切片的值),以保持响应格式一致,因此客户端不会中断。
解组时出现以下错误:
json:无法将数组解封为字符串类型的Go值
有谁能告诉我该怎么做吗?
我尝试了下面的google.protobuf.Any,但无法完全理解解组部分。
message Event {
string type = 1;
google.protobuf.Any names = 2;
}
解组代码片段:
evnt := new(pb.Event)
unmarshaler = jsonpb.Unmarshaler{AllowUnknownFields: true}
unmarshaler.Unmarshal(bytes.NewReader(*<json.RawMessage>*), evnt)
让名称成为一个类型,然后给它一个自定义的UnmarshalJSON
方法。例子:
package main
import (
"encoding/json"
"fmt"
"os"
"strings"
)
type name struct {
New []string
Old string
}
type event struct {
Type string `json:"type"`
Name name `json:"name"`
}
func do(j string) {
var e event
err := json.Unmarshal([]byte(j), &e)
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to unmarshall %s: %sn", j, err)
return
}
fmt.Printf("%vn", e)
}
func (n *name) UnmarshalJSON(text []byte) error {
t := strings.TrimSpace(string(text))
if strings.HasPrefix(t, "[") {
return json.Unmarshal(text, &n.New)
}
return json.Unmarshal(text, &n.Old)
}
func main() {
jsonstring := `{"type":"a","name":"rodney"}`
jsonarray := `{"type":"a","name":["rodney","dangerfield"]}`
do(jsonstring)
do(jsonarray)
}
游乐场:https://go.dev/play/p/sNtUZKHC_Rt