我需要一些解组方面的帮助。我有这个示例代码:
package main
import (
"encoding/json"
"fmt"
)
type Obj struct {
Id string `json:"id"`
Data []byte `json:"data"`
}
func main() {
byt := []byte(`{"id":"someID","data":["str1","str2"]}`)
var obj Obj
if err := json.Unmarshal(byt, &obj); err != nil {
panic(err)
}
fmt.Println(obj)
}
Run Code Online (Sandbox Code Playgroud)
我在这里尝试做的 - 将字节转换为结构,其中一个字段的类型是[]byte。我得到的错误:
恐慌:json:无法将字符串解组为 uint8 类型的 Go 结构字段 Obj.data
这可能是因为解析器已经看到“data”字段已经是一个切片并尝试将“str1”表示为一些字符字节码(类型 uint8?)。
如何将整个数据值存储为一个字节数组?因为我想稍后将值解组到字符串切片中。我没有在 struct 中包含一段字符串,因为这种类型可以改变(字符串数组、int、字符串等),我希望这是通用的。
如果[]byte 真的是你想要的,使用json.RawMessage,这是型[]byte,但也实现了JSON解析方法。我相信这可能是您想要的,因为它会接受data. 当然,您必须手动解析Data以找出其中的实际内容。
一个可能的好处是这会跳过任何繁重的解析,因为它只是复制了bytes。当您想将此数据用于某事时,您可以使用 a []interface{},然后使用类型开关来使用单个值。
https://play.golang.org/p/og88qb_qtpSGJ
package main
import (
"encoding/json"
"fmt"
)
type Obj struct {
Id string `json:"id"`
Data json.RawMessage `json:"data"`
}
func main() {
byt := []byte(`{"id":"someID","data":["str1","str2", 1337, {"my": "obj", "id": 42}]}`)
var obj Obj
if err := json.Unmarshal(byt, &obj); err != nil {
panic(err)
}
fmt.Printf("%+v\n", obj)
fmt.Printf("Data: %s\n", obj.Data)
// use it
var d []interface{}
if err := json.Unmarshal(obj.Data, &d); err != nil {
panic(err)
}
fmt.Printf("%+v\n", d)
for _, v := range d {
// you need a type switch to deterine the type and be able to use most of these
switch real := v.(type) {
case string:
fmt.Println("I'm a string!", real)
case float64:
fmt.Println("I'm a number!", real)
default:
fmt.Printf("Unaccounted for: %+v\n", v)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的第一个建议是[]string,[]byte如果您知道输入类型将是一个字符串数组,则只使用而不是使用。
如果data要成为具有各种类型的 JSON 数组,那么您最好的选择是[]interface{}改用 - Go 会很乐意为您解组 JSON,您可以在运行时执行检查以根据需要将它们转换为更具体的类型化变量.
| 归档时间: |
|
| 查看次数: |
27912 次 |
| 最近记录: |