戈朗: "json: cannot unmarshal array into Go value of type string"



我有一个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

相关内容

  • 没有找到相关文章

最新更新